Rails 3:测试期间重复的验证错误消息

wul*_*one 9 validation rspec ruby-on-rails machinist

我得到一些奇怪的验证行为:它复制了我的验证错误消息,我无法弄清楚导致它的原因......它不会在rails控制台中执行此操作.

以下是我的手机型号的验证:

# phone.rb
validates :number, :length => { :minimum => 3 }
Run Code Online (Sandbox Code Playgroud)

我的规格:

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
Run Code Online (Sandbox Code Playgroud)

我的测试结果:

# 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
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我得到的是"太短(最少3个字符)"两次......在测试期间它也是/仅/正在发生.有任何想法吗?

谢谢!

Reb*_*ury 9

问题在于:

Dir["#{Rails.root}/app/**/*.rb"].each { |f| load f }
Run Code Online (Sandbox Code Playgroud)

在spec_helper.rb文件中的Spork.each_run块中

如果将方法'load'更改为'require',则可以解决问题.

或者,如果您有最新版本的Spork,则可以完全删除该行.我很确定当有人使用旧指令安装较新版本Spork(0.9.0+)时会导致错误,因为该行:

Dir["#{Rails.root}/app/**/*.rb"].each { |f| load f }
Run Code Online (Sandbox Code Playgroud)

甚至不必在spec_helper.rb文件中明确声明.如果是在spec_helper.rb文件中使用load方法时,它会重新加载指定的文件,很可能是奇怪的RSpec重复验证错误的原因.