2012-09-21 60 views
1

我在查找最優雅的方式來測試模型中屬性的範圍時遇到了一些麻煩。我的模型看起來像:rspec測試模型的最小值和最大值

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

您的測試不是您的範圍?它不應該是這樣的:它{應該ensure_inclusion_of(:小時).in_range(1..23)} – juicedM3

回答

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個測試。

+0

這對大範圍來說似乎不切實際。而如果你想測試一系列的浮點數呢? – zetetic

+0

這對浮點數不起作用:「遍歷元素rng,將每個元素依次傳遞給塊。如果該範圍的起始對象支持succ方法(這意味着您無法迭代範圍浮動物體)「。 http://www.ruby-doc.org/core-1.9.3/Range.html – jethroo

+0

嗯,是的。這是我的觀點。 – zetetic

1

您要查找的匹配器是is_greater_than和is_less_than匹配器。他們可以按照如下

it {should validate_numericality_of(:hours).is_greater_than(0).is_less_than(24)} 

這將驗證在你的範圍內的號碼都產生了有效的變量和返回的錯誤號碼的開出該範圍是正確的被鏈接到validate_numericality_of匹配。您正確的說,ensure_inclusion_of匹配器不起作用,因爲它期待着一種不同類型的錯誤,但這種驗證應該可以正常工作。

+0

您能否詳細說明如何解決OP的問題? – sgress454

+0

現在更好回答? – lemonginger