9

奇妙な検証動作が発生しています。検証エラーメッセージが重複していて、原因がわかりません...Railsコンソールではこれが行われません。

これが私の電話モデルからの検証です:

# 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回発生しています...これもテスト中に/only/発生しています。何か案は?

ありがとう!

4

4 に答える 4

9

問題は次のとおりです。

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

spec_helper.rbファイルのSpork.each_runブロック

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

または、Sporkの最近のバージョンが十分にある場合は、その行を完全に削除できます。誰かが古い命令で新しいバージョンのSpork(0.9.0+)をインストールしているときに、エラーが発生することは間違いありません。

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

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

于 2012-08-08T20:36:41.093 に答える
1

重複するエラーメッセージの同様の問題が発生しましたが、標準とは異なるディレクトリ構造を使用したことが原因のようです。例:

- app
  \- models_one
  |- models_two
  |- models_three

ブロック内の私のload/require呼び出しは次のようになりました:Spork.each_run

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を使用しているため、関連していない可能性があります。

于 2013-02-17T12:22:38.900 に答える
0

これで問題が解決するかどうかはわかりませんが、rspecの規則に従わないと、rspecは非常に風変わりです。次のような慣用的なrspecを試してください。

'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に組み込まれている検証を単体テストするべきではないことをお勧めします。それらはすでにRails自体でテストされています。具体的には、長さの検証はactivemodel / test /cases /validations/length_validation_test.rbでテストされます。検証の動作は、統合テストでカバーする必要があります。

お役に立てば幸いです。

于 2012-03-13T21:08:32.180 に答える
0

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

モデルが2回必要になり、検証が2回実行されることに関係しているのではないかと思います。

require 'phone'仕様の一番上に明示的に記載している場合は、修正されているようです。

しかし、私は本当に問題の原因を知りたいです...

于 2012-04-25T11:54:34.617 に答える