Rails 2.3.4+ でシード データをロードする新しい標準的な方法であるdb:seed
rake タスクを使用しようとしています。
アプリケーションが実際に正しく機能するために必要な定数データをロードしています。
db:seed
データが事前入力されるように、テストの前にタスクを実行する最善の方法は何ですか?
Rails 2.3.4+ でシード データをロードする新しい標準的な方法であるdb:seed
rake タスクを使用しようとしています。
アプリケーションが実際に正しく機能するために必要な定数データをロードしています。
db:seed
データが事前入力されるように、テストの前にタスクを実行する最善の方法は何ですか?
db:seed
rake タスクは主にスクリプトをロードするだけですdb/seeds.rb
。したがって、そのファイルを実行してデータをロードするだけです。
load "#{Rails.root}/db/seeds.rb"
# or
Rails.application.load_seed
どこに配置するかは、使用しているテスト フレームワークと、すべてのテストの前にロードするか、最初に 1 回だけロードするかによって異なります。setup
通話またはファイルに入れることができtest_helper.rb
ます。
上記のスティーブのコメントは正しい答えだと思います。を使用Rails.application.load_seed
して、シード データをテスト環境にロードできます。ただし、このデータがロードされるタイミングと頻度は、いくつかの要因によって異なります。
すべてのテストの前にこのファイルを 1 回実行する便利な方法はありません (この Github issueを参照してください)。おそらくテストファイルのセットアップメソッドで、各テストの前にデータを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
お役に立てれば。
lib/tasks/test_seed.rake に次のようなものを配置すると、db:test:load の後にシード タスクが呼び出されます。
namespace :db do
namespace :test do
task :load => :environment do
Rake::Task["db:seed"].invoke
end
end
end
load ...
シードバンクを使用している場合は、シードのロード方法が変更されるため、ここで提供されているソリューションを使用できない/使用したくない場合があります。
そしてRake::Task['db:seed'].invoke
test_helperに入れるだけで、次のようになりました。
Don't know how to build task 'db:seed' (RuntimeError)
しかし、その前に load_tasks を追加すると、うまくいきました:
MyApp::Application.load_tasks
Rake::Task['db:seed'].invoke
db:test:prepare の一部として db:seed を呼び出します。
Rake::Task["db:seed"].invoke
このようにして、シード データは、テスト クラスごとに 1 回ではなく、テスト実行全体に対して 1 回ロードされます。
rake タスクに追加Rake::Task["db:seed"].invoke
してもdb:test:prepare
うまくいきませんでした。でデータベースを準備しrake db:test:prepare
、テスト環境内でコンソールに入ると、すべてのシードがそこにありました。ただし、シードはテスト間で持続しませんでした。
ただし、セットアップ方法に追加load "#{Rails.root}/db/seeds.rb"
するとうまくいきました。
これらのシードを自動的にロードして持続させたいと思っていますが、まだそれを行う方法が見つかりません!