2012-03-22 13 views
3

私はFactoryGirlをフィクスチャに使用していますが、実際には有効な検証エラーを生成していません。FactoryGirlが有効な検証エラーを出さない

私はいつもactiverecord.errors.models.messages.record_invalidのメッセージを受け取ります。

これを診断するためにさらに詳細が必要であるかどうかは不明です。これにより、各エラーを追跡するのが非常に遅いプロセスになります。

例の工場:

Factory.define :partner do |partner| 
    partner.sequence(:username){ |n| "amcconnon#{n}" } 
    partner.first_name   "Bobby Joe" 
    partner.last_name    "Smiley" 
    partner.sequence(:email){ |n| "bob{n}@partners.com" } 
    partner.phone_number   "5557 5554" 
    partner.country_id   75 
    partner.password    "password" 
    partner.password_confirmation "password" 
end 

その後工場(:パートナー)=> "はActiveRecord :: RecordInvalid例外:何かがこれらの変更を間違っていたように見えます"

実際の問題は、もちろんメールですシーケンスはnを正しく使用せず、電子メールに対して独自の検証が行われます。しかしそれは説明のためです。

レール=> 3.2.2 factory_girl 2.6.1

これを診断するために必要なその他のdeets?

(注:これはちょうど工場を読みやすくを追加するように編集)

EDIT:ビジャンさんのコメントを1として

:「まさに私は何をしようとしています」

"rspec spec"を実行しようとしています。 Factory.new({blah ...})から取得するのと同じエラーが含まれていない場合、Factory(:パートナー)のようなファクトリをこの場合はエラーメッセージとして使用したいと思います。次に、検証の失敗を見ました。

+0

あなたは正確に何をしようとしていますか?個々のエラーでpartner.errorsまたは.messageを呼び出して、問題の内容を調べることができます。 – Bijan

+0

最後に私の編集を参照してください –

+0

したがって、バリデーションに失敗した属性を意図的に含むファクトリ定義を変更してバリデーションをテストしようとしていますか?それとも私は誤解したことがありますか? –

答えて

0

ここで重要な点は、テストを設定しているときに、テストしているコードが、期待値を設定した時点で失敗することを確認する必要があるということですRspec)。検証のテストに関する特定の問題は、もちろん、ActiveRecordオブジェクトを保存しようとするとすぐに検証が失敗することです。テストセットアップはsaveを呼び出さないでください。

特定suggesions:

1)IMO工場定義が有効なオブジェクトを作成するために必要な最低限の情報が含まれている必要があり、できるだけ少し変更する必要があります。検証をテストする場合は、新しいテストオブジェクトをインスタンス化するときに、テストする特定の属性をオーバーライドできます。

2)検証をテストする場合は、Factory.buildを使用してください。 Factory.buildは、指定された属性を持つActiveRecordインスタンスを作成しますが、保存しようとしません。これは、テストで期待値を設定するまで検証をトリガーしないようにすることを意味します。

どうやってこのようなことができますか?

it "should fail to validate a crap password" do 
    partner_with_crap_password = Factory.build(:partner, :password => "crap password") 
    partner_with_crap_password.should_not be_valid 
end 
2

これはまさにあなたが持っていたのと同じ問題がある場合、私はわからないんだけど、それは私が検証エラーメッセージは非常に有用ではないと持っていた問題だと私はそれが、この探して他の人に役立つ可能性が考え問題。以下は私が思いついたものです。これは異なる情報を与えるために変更することもできます。

include FactoryGirl::Syntax::Methods 

# Right after you include Factory Girl's syntax methods, do this: 

def create_with_info(*args, &block) 
    create_without_info(*args, &block) 
rescue => e 
    raise unless e.is_a? ActiveRecord::RecordInvalid 
    raise $!, "#{e.message} (Class #{e.record.class.name})", $!.backtrace 
end 
alias_method_chain :create, :info 

あなたがcreate :model_nameを使用するときに、それは常にエラーメッセージにモデル名が含まれます。私たちはかなり深い依存関係(はい、別の問題)を持っていて、 "名前は無効です"というような検証エラーがありました...そしてnameはいくつかの異なるモデルの属性でした。この方法を追加すると、かなりのデバッグ時間が節約されます。

関連する問題