Rails 3:在测试过程中出现重复的验证错误消息
我收到了一些奇怪的验证行为:它重复了我的验证错误消息,我找不出是什么原因造成的......它不会在rails控制台中执行此操作。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个字符)”两次......测试期间也是/仅发生/发生。 任何想法?
谢谢!
的问题是在该行:
Dir["#{Rails.root}/app/**/*.rb"].each { |f| load f }
在spec_helper.rb文件
,在Spork.each_run块
如果将方法'load'更改为'require',它会修复问题。
或者如果您有最近版本的Spork,可以完全删除该行。 我敢肯定的错误是,当有人安装较新版本叉勺(0.9.0+)旧指令造成的,因为该行:
Dir["#{Rails.root}/app/**/*.rb"].each { |f| load f }
甚至不具有明确的规定spec_helper .rb文件了。如果在spec_helper.rb文件中使用load方法时,它将重新加载指定的文件,这很可能是奇怪的RSpec重复验证错误的原因。
为我工作,谢谢 –
很多人投了这个票,我打算将它标记为已回答(我很久没有使用spork了)。 – wulftone
我不确定这是否会解决您的问题,但如果您不遵循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中进行了测试。验证的行为应该包含在集成测试中。
我希望这很有帮助。
很酷,谢谢你。单元测试验证的重点是非常快速的白名单/黑名单,你关心/不关心的事情(集成测试不如单元测试快!),并且valid_attribute gem非常适合这个...但是,仅供参考,以上示例直接来自rspec网站的示例验证示例:https://www.relishapp.com/rspec/rspec-rails/v/2-8/docs/model-specs/errors-在 – wulftone
我遇到同样的问题(使用rspec & spork)。
我怀疑这是模型需要两次,导致验证运行两次。
如果您在规格顶部显示require 'phone'
,它似乎可以解决它。
但我真的很想知道发生了什么导致了问题...
我遇到重复的错误消息的类似的问题,但它似乎从我的使用比标准,例如不同的目录结构来干:
- 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,因此它可能不相关。
你的关联定义是什么样子,你使用validates_associated? –
在电话中,它有'has_one:user',在用户中,'has_many:phones'。我开始使用'valid_attribute' gem来测试我的validatons,并且比这个方法好得多。 – wulftone
您是否找到解决方案? – MrEvil