web-dev-qa-db-ja.com

db:seedデータをテストデータベースに自動的にロードする方法

Rails 2.3.4 +、db:seed rakeタスク]でシードデータをロードする新しい標準的な方法を使用しようとしています。

アプリケーションが実際に正しく機能するために必要な定数データをロードしています。

テストの前にdb:seedタスクを実行するための最良の方法は何ですか?

115
Luke Francl

db:seed rakeタスクは主にdb/seeds.rb 脚本。したがって、そのファイルを実行してデータをロードするだけです。

load "#{Rails.root}/db/seeds.rb"

# or

Rails.application.load_seed

配置する場所は、使用しているテストフレームワークと、すべてのテストの前にロードするか、最初に一度だけロードするかによって異なります。 setup呼び出しまたはtest_helper.rbファイル。

116
ryanb

私はそれがあるべきだと思います

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)

84

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
17
Nick M

Steveのコメント 上記が正しい答えだと思います。 _Rails.application.load_seed_を使用して、シードデータをテスト環境にロードできます。ただし、このデータがロードされるタイミングと頻度は、いくつかの事項に依存します。

Minitestを使用する

すべてのテストの前にこのファイルを1回実行する便利な方法はありません( このGithubの問題 を参照)。各テストの前に、おそらくテストファイルのセットアップ方法でデータをロードする必要があります。

_# test/models/my_model_test.rb
class LevelTest < ActiveSupport::TestCase

  def setup
    Rails.application.load_seed
  end

  # tests here...

end
_

RSpecを使用する

RSpecのbefore(:all)メソッドを使用して、このモデルのすべてのテストのシードデータをロードします。

_describe MyModel do
  before(:all) do
  Rails.application.load_seed
end

describe "my model..." do
  # your tests here
end
_

お役に立てれば。

13
Matt

シードバンクを使用する場合は、シードのロード方法が変更されるため、ここで提供される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
3
Gary S. Weaver

Db:test:prepareの一部としてdb:seedを呼び出しています:

Rake::Task["db:seed"].invoke

このようにして、シードデータはテストクラスごとに1回ではなく、テスト実行全体に1回ロードされます。

3
jondahl

Rake::Task["db:seed"].invokedb:test:prepare rakeタスクに追加しても機能しませんでした。 rake db:test:prepareを使用してデータベースを準備し、テスト環境内のコンソールに入った場合、すべてのシードがそこにありました。ただし、テストの間、シードは持続しませんでした。

ただし、load "#{Rails.root}/db/seeds.rb"を私のセットアップ方法に追加するとうまくいきました。

これらのシードを自動的にロードして持続させたいのですが、まだそれを行う方法が見つかりませんでした!

2
alexpls