【问题标题】:In RSpec - how can I test if one attribute is less (or more) than another在 RSpec - 我如何测试一个属性是否小于(或大于)另一个属性
【发布时间】:2013-02-07 20:38:24
【问题描述】:

在我的应用中,我想要一个 Car 模型。

其中包含两个字段:date_fromdate_till(指定有人使用它的时间段)。

我希望模型验证 date_from 应该小于或等于 date_till。

我的 model_spec.rb 草稿如下所示:

require 'spec_helper'

describe Car do
  it {should validate_presence_of(:model)}
  it {should validate_presence_of(:made)}

  it "should have date_till only if it has date_from"
  its "date_till should be >= date_from"
end

显然,我可以编写一个“长”测试,尝试将 date_till 设置为大于 date_from - 并且模型应该是无效的。但也许有一些优雅的方法可以做到这一点?

那么,我如何(使用 RSpec 匹配器)验证一个字段不大于另一个字段?

更新: 我查看了@itsnikolay 的答案并这样编码:

it "should not allow date_till less than date_from" do
  subject.date_from = Date.today
  subject.date_till = Date.today - 1.day

  subject.valid?.should be_false
end

必须在没有匹配器的情况下这样做。好吧,不是悲剧:)

【问题讨论】:

    标签: ruby-on-rails ruby rspec tdd bdd


    【解决方案1】:

    只需使用<=

    date_from.should be <= date_till
    

    【讨论】:

    • 如果它们都初始化为 nil?测试会通过,但它是否涵盖了所有行为?
    【解决方案2】:
    @car = Car.create \
      name:      'Buggy',
      date_from: Date.today + 1.day,
      date_till: Date.today + 2.day
    
    expect(@car.date_from).to be <= @car.date_till
    

    更多详情:RSpec Comparison matchers

    【讨论】:

      【解决方案3】:

      一般是recommended to use expect, not should

      例如:

        expect(@car.date_from).to be <= @car.date_till
      

      资源: - BetterSpecs examples - Rspec Docs

      【讨论】:

      • 如果你喜欢单线:it { is_expected.to be &lt;= @car.date_till }
      【解决方案4】:

      或者用新的语法

      expect(date_from).to be <= date_till
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-27
        • 2019-10-28
        • 2014-10-14
        • 1970-01-01
        • 1970-01-01
        • 2017-12-14
        • 1970-01-01
        相关资源
        最近更新 更多