2011-09-23 2 views
9

私はいくつかの奇妙な検証動作をしています:それは私の検証エラーメッセージを複製しています。何が原因であるのかわかりません...レールコンソール。ここでRails 3:テスト中に重複した検証エラーメッセージ

は、私の携帯電話モデルからの検証です:

# phone.rb 
validates :number, :length => { :minimum => 3 } 

マイスペック:

require 'spec_helper' 

describe Phone do 
    it "requires a number" do 
    user = User.make! 
    @p = Phone.new(number:nil,user_id:user.id,type:2) 
    @p.valid? 
    puts @p.errors.inspect 
    @p.should have(1).error_on(:number) 
    end 

私のテスト結果:

# rspec and machinist 
#<ActiveModel::Errors:0x000000036f1258 @base=#<Phone id: nil, user_id: 614, kind: nil, number: nil, created_at: nil, updated_at: nil>, @messages={:number=>["is too short (minimum is 3 characters)", "is too short (minimum is 3 characters)"]}> 
F 

Failures: 

    1) Phone requires a number 
    Failure/Error: @p.should have(1).error_on(:number) 
     expected 1 error on :number, got 2 
    # ./spec/models/phone_spec.rb:11:in `block (2 levels) in <top (required)>' 

Finished in 0.50988 seconds 
1 example, 1 failure 

あなたが見ることができるように、私は取得しています"短すぎます(最小は3文字です)" ... 2回...テスト中にも/これだけです。 アイデア

ありがとうございます!

+0

あなたの関連定義はどのように見えますか?そしてvalidates_associatedを使用しますか? –

+0

電話では、それは 'has_one:user'であり、Userでは' has_many:phones'です。バリデーションをテストするために 'valid_attribute'という宝石を使い始めました。これはこのメソッドよりもはるかにいいです。 – wulftone

+0

解決策を見つけましたか? – MrEvil

答えて

9

問題はラインである:Spork.each_runブロックでは、spec_helper.rbファイル内

Dir["#{Rails.root}/app/**/*.rb"].each { |f| load f } 

'load'メソッドを 'require'に変更すると、問題が修正されます。

最新バージョンのSporkをお持ちの場合は、その行を完全に削除することができます。 ラインので、私は、誰かが古い命令で新しいバージョンの先割れスプーン(0.9.0+)をインストールしたときにエラーが発生しているかなり確信している:

Dir["#{Rails.root}/app/**/*.rb"].each { |f| load f } 

もspec_helperで明示的に記述する必要がありません.rbファイルはもうありません。 spec_helper.rbファイルでloadメソッドが使用されている場合は、指定されたファイルがリロードされます。おそらく、奇妙なRSpec重複検証エラーの原因です。

+0

私のために働いてくれてありがとう –

+0

多くの人がこの1つに投票しました。私はそれを答えとしてマークします(私は長い間sporkを使用していません)。 – wulftone

0

これはあなたの問題を解決するかどうかはわかりませんが、rspecの規約に従わないとrspecは非常に奇妙です。次のようないくつかのより多くの慣用的なRSpecのを試してみてください:

は、私はまた、あなたがいけないユニットテストRailsの検証に建てられたことを示唆したい「spec_helper」

describe Phone do 
    context :validations do 
    let(:user) { double(:user) } 
    subject { Phone.new(number:nil,user_id:user.id,type:2) } 

    before do 
     subject.valid? 
    end 

    it 'should have a minimum length of 3' do 
     subject.should have(1).error_on(:number) 
    end 
    end 
end 

が必要です。それらはすでにRails自体でテストされています。具体的には、長さの検証はactivemodel/test/cases/validations/length_validation_test.rbでテストされています。検証の動作は、統合テストでカバーする必要があります。

私はそれが役に立ちそうです。

+0

これはありがとう、ありがとう。ユニットテストの検証のポイントは、あなたが気にしている/気にしないホワイトリスト/ブラックリストの物事です(統合テストはユニットテストほど高速ではありません!)、valid_attribute gemはこれに最適です...参考までに、上記の例は、モデル検証に関するrspecのWebサイトの例(https://www.relishapp.com/rspec/rspec-rails/v/2-8/docs/model-specs/errors-html)から直接取ったものです。 on – wulftone

0

私は同じ問題を抱えています(rspec & sporkを使用しています)。

モデルが2回必要であることが原因で、2回検証が行われることが考えられます。

specicleの先頭にあるrequire 'phone'を明白に修正したようです。

しかし、私は実際には問題を引き起こしているかを知りたいのですが...

1

私は、重複したエラーメッセージの同様の問題に遭遇したが、標準とは異なるディレクトリ構造の私の使用から生じるように見えた、例えば:Spork.each_runブロックで

- app 
    \- models_one 
    |- models_two 
    |- models_three 

マイload/require呼び出しが見えましたこのように:

Dir["#{Rails.root}/app/models_*/*.rb"].each { |f| load f } 

私はこれを削除し、これらとそれを置き換える:

ActiveSupport::Dependencies.clear 
ActiveRecord::Base.instantiate_observers 

さらに重複するエラーメッセージはありませんでした。

投稿者:http://adams.co.tt/blog/2012/04/12/duplicate-active-model-validation-errors/投稿者は、同じファイルに解決するさまざまなパスを必要とする1.8.7固有の問題だと言っていますが、1.9.3を使用しています。

関連する問題