我在找到测试模型中属性范围的最优雅方法时遇到了一些麻烦。我的模型看起来像:
class Entry < ActiveRecord::Base
attr_accessible :hours
validates :hours, presence: true,
:numericality => { :greater_than => 0, :less_than => 24 }
end
我的rspec测试看起来像:
require 'spec_helper'
describe Entry do
let(:entry) { FactoryGirl.create(:entry) }
subject { entry }
it { should respond_to(:hours) }
it { should validate_presence_of(:hours) }
it { should validate_numericality_of(:hours) }
it { should_not allow_value(-0.01).for(:hours) }
it { should_not allow_value(0).for(:hours) }
it { should_not allow_value(24).for(:hours) }
# is there a better way to test this range?
end
此测试有效,但是有更好的方法来测试最小值和最大值吗?我的方式似乎很笨重。测试值的长度似乎很容易,但我没有看到如何测试数字的值。我尝试过这样的事情:
it { should ensure_inclusion_of(:hours).in_range(0..24) }
但那是期待包含错误,我无法通过测试。也许我没有正确配置它?
我最终在我的边界上方,上方和下方进行了测试,如下所示。因为我不限制整数我测试到两位小数。我认为这对于我的应用来说可能“足够好”。
it { should_not allow_value(-0.01).for(:hours) }
it { should_not allow_value(0).for(:hours) }
it { should allow_value(0.01).for(:hours) }
it { should allow_value(23.99).for(:hours) }
it { should_not allow_value(24).for(:hours) }
it { should_not allow_value(24.01).for(:hours) }
答案 0 :(得分:2)
你正在寻找的匹配器是is_greater_than和is_less_than匹配器。它们可以链接到validate_numericality_of匹配器上,如下所示
it {should validate_numericality_of(:hours).is_greater_than(0).is_less_than(24)}
这将验证您范围内的数字是否产生有效变量,并且对于超出该范围的数字返回的错误是正确的。你是正确的,ensure_inclusion_of匹配器不起作用,因为它期望一个不同类型的错误,但这个验证应该工作正常。
答案 1 :(得分:0)
要测试是否涵盖了所有有效值,您可以编写如下内容:
it "should allow valid values" do
(1..24).to_a.each do |v|
should allow_value(v).for(:hours)
end
您还可以实施边界测试。对于每个边界,可以在任何边界上,上方和下方测试,以确保条件逻辑按预期工作as posted by David Chelimsky-2。
因此,对于2个边界,您将总共进行6次测试。