【问题标题】:How to use Shoulda matchers to test date validation如何使用 Shoulda 匹配器来测试日期验证
【发布时间】:2016-07-14 09:32:21
【问题描述】:

我验证一个日期字段如下:

验证:return_date,包含:{in:(Date.today+1.day..Date.today+4.weeks)}

我使用 Rspec 语法对其进行测试,如下所示:

it "should only accept return date that is later than the current date" do
    quotation_request = FactoryGirl.build(:quotation_request, return_date: Date.today)
    expect(quotation_request.valid?).to be_falsy
end

报价请求模型中的验证:

validates :return_date, inclusion: {in:(Date.today+1.day..Date.today+4.weeks)

这行得通。我想知道是否有一种方法可以使用 Shoulda 匹配器来测试它,如果可以,使用哪一个以及如何测试?

【问题讨论】:

    标签: rspec-rails ruby-on-rails-4.2 shoulda


    【解决方案1】:

    首先,您应该使用 proc 来评估日期

    validates :return_date, inclusion: { in: ->(model) { (Date.today+1.day)..(Date.today+4.weeks) } }
    

    然后你可以对给定的字段进行调整,看看它什么时候是假的,什么时候是真的

    # Set the expectation that the factory is setup correctly
    expect(quotation_request).to be_valid
    
    # Then check that values "just" out of range make it invalid
    quotation_request.return_date = Date.today
    expect(quotation_request).not_to be_valid
    
    quotation_request.return_date = Date.today+4.weeks+1.day
    expect(quotation_request).not_to be_valid
    

    【讨论】:

    • 我添加了用于日期的验证,以使我正在测试的内容更清晰
    • 我已经更新了答案,以便更好地描述如何解决您遇到的问题@chell
    • 谢谢诺特。我尝试使用您显示的 proc,但它会产生错误数量的参数(1 代表 0)。这个内置的 Rails 日期与 proc 的工作方式不一样吗?
    • @chellapparently 包含验证将 模型本身 发送到 proc 中,我再次更新了帖子以匹配此 - 希望这会有所帮助
    猜你喜欢
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 2015-01-18
    • 1970-01-01
    • 2012-11-28
    • 1970-01-01
    相关资源
    最近更新 更多