【发布时间】:2020-08-18 05:07:58
【问题描述】:
使用:
- Ruby 2.6.6
- Rails 6.0.2.2
我有一个模型Part,它有两个字段quantity_available 和minimum_order。
我有以下验证以确保:
-
minimum_order和quantity_available必须存在 -
minimum_order和quantity_available不能为 0 或负数 -
minimum_order的值不能高于quantity_available
class Part < ApplicationRecord
validates :quantity_available, :minimum_order, presence: true
validates_numericality_of :quantity_available, :minimum_order, only_integer: true, greater_than: 0
validates_numericality_of :minimum_order, only_integer: true, less_than: :quantity_available
end
当我使用 rails console 手动测试它以创建与上述验证冲突的新部件时,验证工作正常,但是我的一个 RSpec 测试失败
# RSpec
RSpec.describe Part, type: :model do
let(:part) { Part.new(quantity_available: 250, minimum_order: 10)}
it 'is not valid without a Quantity Available' do
part.quantity_available = nil
expect(part).to_not be_valid
end
end
# Console Error
Failures:
1) Part basic checks is not valid without a Quantity Available
Failure/Error: expect(part).to_not be_valid
TypeError:
cant convert nil into Float
# ./spec/models/part_spec.rb:32:in `block (3 levels) in <top (required)>'
正如您所看到的,这是一个非常简单的测试,它只是说明没有 quantity_available 的部件应该失败,但是在这种情况下,它在技术上确实失败了,只是不是按照我希望它失败的方式。
我最好的猜测是,它可能与在测试中将quantity_available 声明为nil 导致某处电线交叉,因为它无法验证所有三个条件。我对minimum_order 进行了一个测试,与上面的测试相同,但测试通过了。
我在这里做错了什么?
【问题讨论】:
-
可能是因为
only_integer期望它是一个整数,而nil不是一个整数。它在幕后做这件事。你可以做一个expect raise_error。 -
我没有想到
only_integer位,但这是有道理的。删除了它,但同样的事情仍然发生,所以现在我只是将测试转换为expect { part.save }.to raise_error TypeError,它现在就可以了。干杯! -
您确定这是预期行为吗?我认为这是解决方法。
-
@AmitPatel 你是对的,它确实感觉像是一种忽略问题的解决方法。请参阅下面的答案
标签: ruby-on-rails ruby unit-testing validation rspec