web-dev-qa-db-ja.com

RSpecで、ロード時にデータベースをシードする方法は?

テストにrspecを使用していますRails 3 app。テストを開始する前にデータベースをシードする必要があります。次のようにしてデータベースをシードするにはどうすればよいですか。

/ db/seeds.rb

["Admin", "Member"].each do |role_name|
  Role.find_or_create_by_name(role_name)
end

ありがとう

39
AnApprentice

このようなものを試してください

rake db:seed Rails_ENV=test

あなたはやっているすべてのrakeコマンドのリストを得ることができます

rake -T

これがテストデータの場合は、テストの開始時に読み込まれるフィクスチャに配置することを検討する必要がある場合があります。

10
Scott

Spec_helper.rbまたはRails_helper.rb内:

RSpec.configure do |config|
  config.before(:suite) do
    Rails.application.load_seed # loading seeds
  end
end
164
Hannes

スコットのソリューションは確かにあなたのために機能しますが、私はあなたの問題を解決するより良い方法は、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
22
Michał Czapko

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ファイルを複数回ロードした場合にエントリが重複するのを防ぐことができます。

11
fearless_fool

Rspecにシードをロードするには、spec_helperのconfig.before(:suite)でデータベースのクリーンアップ後にシードを追加する必要があります

config.before(:suite) do
  DatabaseCleaner.clean_with(:truncation)
  load Rails.root.join('db', 'seeds.rb')
end
7
Ahmad Hussain

最終的に、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
2
Karen