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
配置する場所は、使用しているテストフレームワークと、すべてのテストの前にロードするか、最初に一度だけロードするかによって異なります。 setup
呼び出しまたはtest_helper.rb
ファイル。
私はそれがあるべきだと思います
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)
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
Steveのコメント 上記が正しい答えだと思います。 _Rails.application.load_seed
_を使用して、シードデータをテスト環境にロードできます。ただし、このデータがロードされるタイミングと頻度は、いくつかの事項に依存します。
すべてのテストの前にこのファイルを1回実行する便利な方法はありません( このGithubの問題 を参照)。各テストの前に、おそらくテストファイルのセットアップ方法でデータをロードする必要があります。
_# 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
_
お役に立てれば。
シードバンクを使用する場合は、シードのロード方法が変更されるため、ここで提供される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::Task["db:seed"].invoke
をdb:test:prepare
rakeタスクに追加しても機能しませんでした。 rake db:test:prepare
を使用してデータベースを準備し、テスト環境内のコンソールに入った場合、すべてのシードがそこにありました。ただし、テストの間、シードは持続しませんでした。
ただし、load "#{Rails.root}/db/seeds.rb"
を私のセットアップ方法に追加するとうまくいきました。
これらのシードを自動的にロードして持続させたいのですが、まだそれを行う方法が見つかりませんでした!