为什么我的Rspec测试长度验证失败? (导轨/保护/ rspec的)

时间:2013-09-15 14:37:33

标签: ruby-on-rails ruby-on-rails-3 rspec rspec2 guard

我对一个处理失败的交易模型进行了一个非常简单的测试,我无法理解为什么。

我的交易模式:

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,它会再次起作用,但只要我重新启动后卫或我的服务器

我尝试了很多次,这总是同样的问题。我不明白,似乎警卫或我的服务器是问题。

有没有人知道为什么会发生这种情况以及如何纠正这个问题?

2 个答案:

答案 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) }