2012-10-30 13 views
7

Jestem trochę nowy w Railsach i Rspec i jako taki nie jestem pewien jak przetestować poprawność daty w moim modelu. Zrobiłem modelowe Wydarzenie, które ma czasy rozpoczęcia i zakończenia i jest kilka ważnych warunków, takich jak czas rozpoczęcia nie może być w przeszłości, a czas zakończenia musi być po czasie rozpoczęcia.Testowanie, że model szyn sprawdza poprawność daty z RSpec

Aby zapewnić te walidacji Używam ValidatesTimeliness https://github.com/adzap/validates_timeliness

Mój model jest następujący:

class Event < ActiveRecord::Base 
    ... 

    validates_datetime :start_date, 
    :after => :now, 
    :after_message => "Event cannot start in the past" 

    validates_datetime :end_date, 
    :after => :start_date, 
    :after_message => "End time cannot be before start time" 
end 

W moim teście RSpec mam:

describe Event do 
    let(:event) { FactoryGirl.build :event } 
    subject { event } 

    context "when start_date is before the current time" do 
    it {should_not allow_value(1.day.ago). 
     for(:start_date)} 
    end 

    context "when end_date is before or on start date" do 
    it {should_not allow_value(event.start_date - 1.day). 
     for(:end_date)} 

    it {should_not allow_value(event.start_date). 
     for(:end_date)} 
    end 

    context "when the end_date is after the start_date" do 
    it {should allow_value(event.start_date + 1.day). 
     for(:end_date)} 
    end 
end 

Jednak to nie robi naprawdę przetestuj, że moja data rozpoczęcia musi być przed dokładną datą. Na przykład, gdybym przypadkowo użył :today zamiast :now w moim modelu, testy te również przejdą.

Czytałem w Internecie, że kiedyś był program RSpec matcher o nazwie validate_date (http://www.railslodge.com/plugins/1160-validates-timeliness), który byłby dokładnie tym, czego szukam, ale o ile mogę powiedzieć, że został usunięty.

Moje pytanie brzmi: jak mogę poprawić moje testy, czy muszę dodać testy, które próbują najmniejszej ilości czasu (tj. Ms), aby zapewnić odpowiednio pozytywny wynik testu lub czy istnieje lepszy sposób, aby to zrobić?

Z góry dzięki!

Odpowiedz

1

można pracować z valid? i errors.messages:

  • Zbuduj Event która przechodzi walidację poza swoimi start_date i end_date
  • Ustaw start_date i end_date w prawej porządku, i twierdzą, że event.valid? jest true
  • Ustaw start_date i end_date w zamówieniu z błędem i potwierdzają, że nie jest to valid?, a że event.errors.messages zawiera poprawne błędy sprawdzania poprawności. (Uwaga, trzeba zadzwonić event.valid? przed sprawdzeniem event.errors.messages, w przeciwnym razie będą one pusty)

Przykład valid? i errors.messages:

user = User.new 
user.errors.messages #=> {} # no messages, since validations never ran 
user.valid? # => false 
user.errors.messages #=> {:email=>["can't be blank"]} 

user.email = "[email protected]" 
user.valid? #=> true 
user.errors.messages #=> {} 
1

Spróbuj

validates_date :end_time, :after => [:start_time, Proc.new {1.day.from_now_to_date}] 
validates_date :start_time, :after => Time.now