4

私はこの工場を持っています:

Factory.define :email_address do |e|
  e.sequence(:address) { |n| "factory_#{n}@example.com" }
  e.validated true
end

でスペックを実行するとrake spec、正常に動作します。

autospec を実行すると、すぐに失敗し、電子メール アドレスが 2 つの異なるオブジェクトで 2 回使用されていると主張します (これを制限する検証があります)。

autospec で動作が異なるのはなぜですか?

4

2 に答える 2

3

Ctrl + Cを使用してテストスイートを中止すると、データベースがダーティになる場合があります。データベースがダーティであるため、新しいオブジェクトを作成すると検証の競合が発生します。rake db:test:cloneもう一度実行するだけで大​​丈夫です。

于 2011-07-02T13:45:11.147 に答える
1

何が起こっているのかと思うのは、FactoryGirl がnからの呼び出しごとにそれをリセットしているということですautospecが、データベースは空になっていません。

まず、この診断を確認するには、工場を次のように変更します。

Factory.define :email_address do |e|
  e.sequence(:address) { |n| puts "Email ##{n}"; "factory_#{n}@example.com" }
  e.validated true
end

私の診断が正しければ、次の 2 つの修正方法があります。

  1. FactoryGirl を、使用される最大 ID より大きいインデックスから開始するように変更します。これにはいくつかの深刻なハッキングが含まれFactory::Sequenceます。おそらく、使用した最高のインデックスを記憶しているから にFactory::Sequence.sequences変更する必要があります。実際、autospecはFactoryGirl クラスを適切にアンロードしているように見えるので、それはうまくいかないかもしれません(そうでなければ、シーケンス ルックアップは失敗せず、新しいオブジェクトが作成されません)。Hash[Symbol => Proc]Hash[Symbol => [Proc, Integer]Factory::Sequence
  2. autospec の実行ごとにデータベースがクリアされない理由を突き止めてください。分解方法を確認しましたか?テスト データベースはトランザクションをサポートしていますか?
于 2010-06-18T12:36:04.700 に答える