128

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

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

db:seedデータが事前入力されるように、テストの前にタスクを実行する最善の方法は何ですか?

4

8 に答える 8

128

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

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

# or

Rails.application.load_seed

どこに配置するかは、使用しているテスト フレームワークと、すべてのテストの前にロードするか、最初に 1 回だけロードするかによって異なります。setup通話またはファイルに入れることができtest_helper.rbます。

于 2009-10-15T20:31:39.960 に答える
17

上記のスティーブのコメントは正しい答えだと思います。を使用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 の使用

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

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

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

お役に立てれば。

于 2016-08-23T21:09:18.713 に答える
17

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
于 2009-12-01T22:52:48.930 に答える
3

load ...シードバンクを使用している場合は、シードのロード方法が変更されるため、ここで提供されているソリューションを使用できない/使用したくない場合があります。

そしてRake::Task['db:seed'].invoketest_helperに入れるだけで、次のようになりました。

Don't know how to build task 'db:seed' (RuntimeError)

しかし、その前に load_tasks を追加すると、うまくいきました:

MyApp::Application.load_tasks
Rake::Task['db:seed'].invoke
于 2014-02-17T22:06:02.667 に答える
3

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

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

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

于 2009-10-15T22:07:36.870 に答える
3

rake タスクに追加Rake::Task["db:seed"].invokeしてもdb:test:prepareうまくいきませんでした。でデータベースを準備しrake db:test:prepare、テスト環境内でコンソールに入ると、すべてのシードがそこにありました。ただし、シードはテスト間で持続しませんでした。

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

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

于 2012-09-19T02:59:50.940 に答える