2

我对一直失败的 Deal 模型进行了非常简单的测试,我不明白为什么。

我的交易模型:

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(hash).should have(1).error_on(:title) 预期出现 1 个错误:标题,得到 2 =>我不明白为什么我有 2 个错误。我应该只得到一个,我的测试就会通过!

最奇怪的事情:-当我这样做rspec spec失败时-然后,如果我将验证字符数更改为 195,并且在测试中更改为 196,它就会通过-但是,下次我重新启动警卫或服务器时,它就会通过再次失败,如果我再次更改为 190 和 191,它会再次运行,但只要我重新启动警卫或我的服务器

我尝试了很多次,它总是同样的问题。我不明白,看来守卫还是我的服务器有问题。

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

4

2 回答 2

4

您可以使用 shoulda 匹配器来测试验证:

it { should ensure_length_of(:title).is_at_most(200) }
于 2013-09-15T17:58:42.270 回答
2

安装了 Shoulda Matchers gem 后,您可以执行以下操作:

it { should validate_length_of(:title).is_at_most(200) }
于 2015-10-21T09:39:48.797 回答