テストにrspecを使用していますRails 3 app。テストを開始する前にデータベースをシードする必要があります。次のようにしてデータベースをシードするにはどうすればよいですか。
/ db/seeds.rb
["Admin", "Member"].each do |role_name|
Role.find_or_create_by_name(role_name)
end
ありがとう
このようなものを試してください
rake db:seed Rails_ENV=test
あなたはやっているすべてのrakeコマンドのリストを得ることができます
rake -T
これがテストデータの場合は、テストの開始時に読み込まれるフィクスチャに配置することを検討する必要がある場合があります。
Spec_helper.rbまたはRails_helper.rb内:
RSpec.configure do |config|
config.before(:suite) do
Rails.application.load_seed # loading seeds
end
end
スコットのソリューションは確かにあなたのために機能しますが、私はあなたの問題を解決するより良い方法は、RSpecのconfigureブロック内にテストデータベースのシードを担当するコードを置くことであったと信じています:
私はSeedFuを使用しており、spec_helperには次のものが含まれています。
RSpec.configure do |config|
# some other configuration code ...
config.before(:suite) do
# ...
SeedFu.seed
# ...
end
# some other configuration code ...
end
rakeを使用してdb/seeds.rbからシードデータを自動ロードする で激しい論争を繰り広げました。ダイハードは、テストのためにシードデータをロードしてはならないことを維持していますが、私は特定のテストのためにシードデータをロードしたい場合があるより穏やかなスタンスをとっています、例えばシードデータが存在することを確認します。
ここで与えられたいくつかの回答とは異なり、spec_helperファイル内から無条件にシードをロードすることをしないことをお勧めします。代わりに、シードが必要なテストファイル内でbefore :each
またはbefore :all
を使用してシードを読み込むことができます。例:
describe "db seed tests" do
before(:each) do
load "#{Rails.root}/db/seeds.rb"
end
...your test code here...
end
@marzapowerが指摘するように、このルートを使用する場合、シードを作成する前に、seeds.dbファイルで各テーブルをクリアするか、find_or_create_by
メソッドを使用する必要があります。 (ヒント:前者はより高速で信頼性が高くなります。)これにより、seeds.dbファイルを複数回ロードした場合にエントリが重複するのを防ぐことができます。
Rspecにシードをロードするには、spec_helperのconfig.before(:suite)でデータベースのクリーンアップ後にシードを追加する必要があります
config.before(:suite) do
DatabaseCleaner.clean_with(:truncation)
load Rails.root.join('db', 'seeds.rb')
end
最終的に、DatabaseCleanerを使用してデータベースを切り捨て、シーディングを行うrakeタスクをロードする必要がありました(私は seedbank を使用しているため)。その後、 database_cleaner README のようなトランザクションでテストをラップして、各テストを新しくロードされたサイトで実行できるようにしました。
RSpec.configure do |config|
config.before(:suite) do
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.clean_with(:truncation)
MyApplicationName::Application.load_tasks
Rake::Task['db:seed'].invoke # loading seeds
end
config.around(:each) do |example|
DatabaseCleaner.cleaning do
example.run
end
end
end