2 Stimmen

rspec-Testmodell für Mindest- und Höchstwerte

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) }

5voto

lemonginger Punkte 345

Der von Ihnen gesuchte Abgleicher ist der is_greater_than und is_less_than Abgleicher. Sie können wie folgt mit dem Abgleicher validate_numericality_of verkettet werden

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

Dadurch wird sichergestellt, dass die Zahlen in Ihrem Bereich eine gültige Variable ergeben und dass der Fehler, der bei Zahlen außerhalb dieses Bereichs zurückgegeben wird, korrekt ist. Sie haben Recht, dass der Abgleich "ensures_inclusion_of" nicht funktioniert, weil er eine andere Art von Fehler erwartet, aber diese Validierung sollte gut funktionieren.

0voto

jethroo Punkte 2058

Um zu prüfen, ob alle gültigen Werte abgedeckt sind, können Sie etwas schreiben wie:

it "should allow valid values" do
  (1..24).to_a.each do |v|
    should allow_value(v).for(:hours)
end

Sie können auch Grenztests durchführen. Für jede Begrenzung kann man an, über und unter jeder Begrenzung testen, um sicherzustellen, dass die bedingte Logik wie erwartet funktioniert gepostet von David Chelimsky-2 .

Sie würden also insgesamt 6 Tests für die 2 Grenzen durchführen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X