为什么我的测试由于日期范围的包含错误而失败?

时间:2013-06-22 17:15:00

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2

我的User模型具有以下验证,并使用了Shoulda Matchers宝石(this is the exact page for the method):

validates_inclusion_of :birthday, 
  :in => Date.new(1850)..Time.now.years_ago(13).to_date, 
  :message => 'Sorry, you must be at least 13 years old to join.'

我正在使用FactoryGirl和Rspec。我对User模型进行了此测试:

describe "valid user age" do
  it { should ensure_inclusion_of(:birthday).in_range(13..150) }
end 

FactoryGirl.define do

  factory :user do
    sequence(:first_name) { |n| "Bob#{n}" }
    sequence(:last_name) { |n| "User#{n}" }
    email { "#{first_name}@example.com" }
    birthday { Date.today - 13.years }
    password "foobarbob"
  end
end

现在从这一切我得到错误:

User valid user age 
     Failure/Error: it { should ensure_inclusion_of(:birthday).in_range(13..150) }
     Did not expect errors to include "is not included in the list" when birthday is set to 12, got error: 

为什么在浏览器中测试它的情况应该如此呢?

1 个答案:

答案 0 :(得分:1)

除了值范围之外,shoulda匹配器还会检查错误消息。如果你查看你发布的链接的实现,你会看到低和高消息默认为:包含(用于查找标准rails错误消息的国际化版本的符号)。

allow value matcher中的错误消息检查允许将预期的消息指定为符号,正则表达式或字符串。

您在验证中使用的测试范围与测试时不同(一系列日期与一系列整数)。如果您将其更改为:

,我相信您的测试将通过
it { should ensure_inclusion_of(:birthday).in_range(Date.new(1850)..Time.now.years_ago(13).to_date).with_message(/must be at least 13/) }