2012-10-30 4 views
7

Sono un po 'nuovo a Rails e Rspec e come tale non sono sicuro di come verificare che le convalide di data e ora siano corrette nel mio modello. Ho creato un evento modello con orari di inizio e fine e alcune condizioni importanti come il tempo di inizio non possono essere nel passato e l'ora di fine deve essere successiva all'ora di inizio.Test di quel modello di rotaie convalida la data con RSpec

Per garantire queste convalide che sto usando ValidatesTimeliness https://github.com/adzap/validates_timeliness

Il mio modello è la seguente:

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 

Nella mia prova RSpec ho:

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 

Tuttavia questo non lo fa davvero testare che la mia data di inizio doveva essere prima della data esatta. Ad esempio se avessi usato accidentalmente :today invece di :now nel mio modello, anche questi test sarebbero superati.

ho letto online che ha usato per essere un matcher RSpec chiamato validate_date (http://www.railslodge.com/plugins/1160-validates-timeliness) che sarebbe esattamente quello che sto cercando, ma per quanto mi riguarda posso dire che è stato rimosso.

La mia domanda è: come posso migliorare i miei test, devo aggiungere test che provino il minor tempo possibile (ad esempio un ms) per garantire il pass/fail di conseguenza o c'è un modo migliore per farlo?

Grazie in anticipo!

risposta

1

si potrebbe lavorare con valid? e errors.messages:

  • Costruire una Event che passa la convalida, se non per start_date e end_date
  • Impostare la start_date e end_date nell'ordine destra, e affermare che event.valid? è true
  • Impostare il start_date e end_date nell'ordine errato e asserire che non è valid? e che event.errors.messages include gli errori di convalida corretti. (Nota, si deve chiamare event.valid? prima di controllare event.errors.messages, altrimenti saranno vuoti)

Esempio per valid? e 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

Prova questa

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