我对一个处理失败的交易模型进行了一个非常简单的测试,我无法理解为什么。
我的交易模式:
class Deal < ActiveRecord::Base
belongs_to :admin_user, :foreign_key => 'admin_user_id'
attr_accessible :url_path,
:country,
:title,
:description,
:twitter_msg,
:image_url,
:prelaunch_date,
:deal_launch_date,
:deal_end_date,
:featured,
:admin_user_id
:as => :admin_user
validates :title,
presence: true,
length: { maximum: 200 }
测试:
require 'spec_helper'
describe Deal do
let(:admin_user) { FactoryGirl.create(:admin_user) }
before(:each) do
@attr = {
url_path: "lorem ipsum",
country: "France",
title: "lorem ipsum",
description: "lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum lorem ipsum",
twitter_msg: "lorem ipsum",
image_url: "lorem ipsum",
prelaunch_date: 1.days.from_now.change(hour: 10),
deal_launch_date: 3.days.from_now.change(hour: 10),
deal_end_date: 15.days.from_now.change(hour: 10),
featured: true,
admin_user_id: 1
}
端
describe "tests on deal models validations for TITLES" do
it { should validate_presence_of(:title) }
it { should_not allow_value(" ").for(:title) }
it "should reject deals with title that is too long" do
long = "a" * 201
hash = @attr.merge(:title => long)
Deal.new(hash).should have(1).error_on(:title)
end
end
并且测试失败了 “针对TITLES的交易模型验证的交易测试应该拒绝标题太长的交易 失败/错误:Deal.new(哈希)。应该有(1).error_on(:title) 预期1错误:标题,得到2 =&GT; 我不知道为什么我有2个错误。我应该只得到一个,我的考试将会过去!
最奇怪的事情:
- 当我rspec spec
时,它失败了
- 然后,如果我将我的验证中的字符数更改为195,并且在我的测试中更改为196,则它会通过
- 但是,下次我重新启动后卫或我的服务器时,它再次失败
如果我再次更改为190和191,它会再次起作用,但只要我重新启动后卫或我的服务器
我尝试了很多次,这总是同样的问题。我不明白,似乎警卫或我的服务器是问题。
有没有人知道为什么会发生这种情况以及如何纠正这个问题?
答案 0 :(得分:4)
您可以使用shoulda匹配器来测试验证:
it { should ensure_length_of(:title).is_at_most(200) }
答案 1 :(得分:1)
安装了Shoulda Matchers gem后,您可以执行以下操作:
it { should validate_length_of(:title).is_at_most(200) }