13

私はいくつかの状態モデルの参照データを入力するために、seeds.rb を使用しています。

State.create :name => 'Alabama', :abbreviation => 'AL'
State.create :name => 'Alaska', :abbreviation => 'AK'
# ...

私は状態フィクスチャを使用していませんが (そもそもシード データであるため、純粋にテストのためにこれを複製する必要があるのは DRY ではないと思います)、Rails テスト フレームワークはテスト中にすべての状態シード データを削除するようです。(テストデータベースを削除、再作成、移行、および再シードしており、単体テストを実行する前にデータが存在することを確認しています。)

その結果、次のアサーションは、seeds.rb では成功しますが、1 行のテストでは失敗します。

assert_equal 51, State.all.size

1) Failure:
test_state_seeds_are_present(StateTest) [/test/unit/state_test.rb:24]:
<51> expected but was
<0>.
1 tests, 1 assertions, 1 failures, 0 errors

ベース テスト クラスのフィクスチャ ステートメントで非 State モデルを明示的にリストすることと、トランザクション フィクスチャ フラグを反転することの両方を試みました (予想どおり、これはテスト中に作成されたレコードにのみ影響します)。当然、検討中のテスト自体がこれらのレコードを削除するわけではありません。

State レコードは常に削除されます。Railsにシードデータから手を離すように指示する方法はありますか? 確実に再ロードされるように、フィクスチャ内のすべてのデータを複製する必要がありますか? 主要な政治イベントを除けば、州のデータは比較的安定していると思います。

ティア

4

6 に答える 6

12

テストはデータベースからすべてのデータを削除してから、フィクスチャをロードします (存在する場合)。

テストを実行する前に、テスト ヘルパーにシード ファイルをロードさせる必要があります。それにはいくつかの方法があります。私の同様の質問をチェックしてください: How to load db:seed data into test database automatically?

最も簡単な方法は、おそらく追加することです

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

test_helper.rb ファイルの先頭に追加します (組み込みのテスト フレームワークを使用していると仮定します)。

于 2009-12-14T04:24:58.857 に答える
4

「シード」機能はテスト アーキテクチャに統合されていません。テストはフィクスチャを中心に構築され、テスト スイートを実行するたびに、Rails はフィクスチャからデータを読み込み、既存のコンテンツを置き換えます。

ただし、データベースにシード データを入力するのは非常に簡単です。

test_helper.rb ファイルで、基本ActionSupport::TestCaseクラスに新しい setup メソッドを追加します。

class ActionSupport::TestCase < ...

  setup :load_seeds

  protected 

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

end
于 2009-12-14T08:12:48.520 に答える
0

これを行うための最良の方法についてはwepposに同意しますが、完全を期すため、およびフィクスチャファイルをすでに持っている可能性がある人々のために、別のアプローチを取り、既存のフィクスチャからデータベースをシードすることができます。

これは、db/seeds.rbファイルで次のようなことを行うことで実現されます。

RAILS_FIXTURES = "#{Rails.root}/spec/fixtures"

models_loaded_from_fixtures = %w[Modela Modelb Modelc ....]

models_loaded_from_fixtures.each do |model|
  Fixtures.create_fixtures(RAILS_FIXTURES, "#{model.tableize}")
  puts "Loaded #{model.constantize.all.size} #{model.pluralize}"
end

または、fixuresディレクトリを読み取り、処理するファイル名の配列を作成することもできます。DBにシードする既存のフィクスチャのどれを指定できるようにするために、上記のプロセスを選択しました。

于 2009-12-14T10:35:03.400 に答える
0

そもそもそのようなテストを書く必要性に疑問があります。シード データ レーキ タスクが適切に機能することをテストしていますか、それとも State クラスの実装の動作をテストしたいですか? 私は後者を想定しているので、フィクスチャを使用していないと述べているので、動作に焦点を当て、Factory Girl (または同様のもの) を使用するテストを作成します。fixtures :allから行を削除してくださいtest/test_helper.rb

実行中のテストの通常の流れにタスクを挿入するために、これは私にとって常に機能するアプローチです。

namespace :test do
  task :force_environment do
    ENV['RAILS_ENV'] = 'test'
    RAILS_ENV.replace('test')
  end
end

%w(test:units test:functionals test:integration).map do |task_name|
  task = Rake::Task[task_name]
  task.clear_prerequisites

  task.enhance %w(db:test:prepare test:force_environment db:seed)
end

それを というファイルに入れるだけで、次に実行するときや他のテスト関連のタスク lib/tasks/testing.rakeを取得することができます。rake test

于 2009-12-14T15:04:35.563 に答える
0

私は同じ問題を抱えていましたが、標準的な答えはうまくいきませんでした。

私の問題は、定数とnamed_scopesのデータベースルックアップを行うクラスファイル内の場所に関係していました。シード データを適切なタイミングでロードする方法が見つかりませんでした。

欠落しているテーブルのフィクスチャ ファイルを削除したにもかかわらず、削除をバイパスする方法を見つけました。

RAILS_ENV=test rake db:seed ruby​​ -Itest test/units/*.rb

于 2011-10-03T14:19:13.267 に答える