Ich habe Schwierigkeiten, den elegantesten Weg zu finden, den Bereich eines Attributs in meinem Modell zu testen. Mein Modell sieht so aus:
class Entry < ActiveRecord::Base
attr_accessible :hours
validates :hours, presence: true,
:numericality => { :greater_than => 0, :less_than => 24 }
end
Meine rspec-Tests sehen so aus:
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
Dieser Test funktioniert, aber gibt es eine bessere Möglichkeit, die Mindest- und Höchstwerte zu testen? Meine Methode scheint klobig zu sein. Es scheint einfach, die Länge eines Wertes zu testen, aber ich sehe nicht, wie man die Werte einer Zahl testen kann. Ich habe etwas Ähnliches versucht:
it { should ensure_inclusion_of(:hours).in_range(0..24) }
Aber das erwartet einen Einschlussfehler, und ich kann meinen Test nicht bestehen. Vielleicht bin ich nicht konfigurieren es richtig?
Ich testete schließlich an, über und unter meinen beiden Grenzen, wie unten vorgeschlagen. Da ich mich nicht auf ganze Zahlen beschränke, prüfe ich auf zwei Dezimalstellen. Ich denke, das ist wahrscheinlich "gut genug" für die Zwecke meiner Anwendung.
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) }