回答:
db:seedrakeタスクは、主にだけロードするdb/seeds.rbスクリプトを。したがって、そのファイルを実行してデータをロードするだけです。
load "#{Rails.root}/db/seeds.rb"
# or
Rails.application.load_seed
どこに配置するかは、使用しているテストフレームワークと、すべてのテストの前にロードするか、最初に一度だけロードするかによって異なります。あなたはそれをsetup通話やtest_helper.rbファイルに置くことができます。
Rails.application.load_seed右下のrequire 'rspec/rails' 私のrails_helperファイルに。database_cleaner gemを使用している場合-各テストの後にシードデータを失わないようにするために少し調整する必要があります。それはgemのドキュメントで確認できます
test/test_helper.rb既存のrequire 'rails/test_help'行の後に追加しました
私はそれがあるべきだと思います
namespace :db do
namespace :test do
task :prepare => :environment do
Rake::Task["db:seed"].invoke
end
end
end
config.active_record.schema_format =:sqlがある場合、db:test:loadは実行されないため(db:test:clone_structure is)
--traceすると、これがどのように機能するかを理解するのに役立ちました。
task 'db:test:prepare' => 'db:seed'
ActiveRecord::Base.establish_connection(ActiveRecord::Base.configurations['test'])前に最終追加Rake::Task["db:seed"].invoke
db:seed実行時の環境がdevelopment奇妙なことに...
上記のスティーブのコメントは正解だと思います。を使用Rails.application.load_seedして、シード環境データをテスト環境にロードできます。ただし、このデータが読み込まれるタイミングと頻度は、いくつかの要因によって異なります。
すべてのテストの前にこのファイルを1回実行する便利な方法はありません(このGithubの問題を参照)。各テストの前に、おそらくテストファイルのセットアップ方法で、データを1回ロードする必要があります。
# test/models/my_model_test.rb
class LevelTest < ActiveSupport::TestCase
def setup
Rails.application.load_seed
end
# tests here...
end
RSpecのbefore(:all)メソッドを使用して、このモデルのすべてのテストのシードデータを読み込みます。
describe MyModel do
before(:all) do
Rails.application.load_seed
end
describe "my model..." do
# your tests here
end
お役に立てれば。
before(:suite)代わりに呼び出しbefore(:all)ます。フォーマットされたコードを含めるために別の回答を投稿しました。
次のように、db:test:prepareの一部としてdb:seedを呼び出しています。
Rake::Task["db:seed"].invoke
このようにして、シードデータはテストクラス全体ではなく、テスト実行全体で1回読み込まれます。
シードバンクを使用している場合は、シードのロード方法が変更されるため、load ...ここで提供されているソリューションを使用することはできません。
そしてRake::Task['db:seed'].invoketest_helperに入れるだけで次の結果が得られました:
Don't know how to build task 'db:seed' (RuntimeError)
しかし、その前にload_tasksを追加すると、うまくいきました:
MyApp::Application.load_tasks
Rake::Task['db:seed'].invoke
マットの答えに基づいて、そのようなルートを取る場合は、ファイルRails.application.load_seed内のbefore(:suite)ブロックでrspec_helper.rbはなく、ブロック内で呼び出すことをお勧めしbefore(:all)ます。このようにして、シードコードは、テストグループごとに1回ではなく、テストスイート全体に対して1回だけ呼び出されます。
rspec_helper.rb:
RSpec.configure do |config|
...
config.before(:suite) do
Rails.application.load_seed
end
...
end
test_helper.rbしたのですが、stackoverflow.com / a / 1998520/68210は機能しました。