2012-10-30 14 views
7

के साथ दिनांक मान्य करता है मैं रेल और रुपेक के लिए थोड़ा नया हूं और इस तरह मुझे यकीन नहीं है कि उस तिथि का सत्यापन कैसे करें मेरे मॉडल में मान्य हैं। मैंने एक मॉडल इवेंट बनाया है जिसमें प्रारंभ और समाप्ति समय है और इन पर कुछ अपमानजनक स्थितियां हैं जैसे प्रारंभ समय अतीत में नहीं हो सकता है और अंत समय प्रारंभ समय के बाद होना चाहिए।परीक्षण मॉडल रेलवे RSpec

इन सत्यापन मैं ValidatesTimeliness https://github.com/adzap/validates_timeliness उपयोग कर रहा हूँ सुनिश्चित करने के लिए

मेरे मॉडल निम्नानुसार है:

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 

मेरी RSpec परीक्षण में मेरे पास है:

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 

हालांकि यह नहीं करता है वास्तव में परीक्षण करें कि मेरी प्रारंभ तिथि सटीक दिनांक समय से पहले होनी चाहिए। उदाहरण के लिए यदि मैं अपने मॉडल में :now के बजाय गलती से :today का उपयोग करता हूं, तो ये परीक्षण भी पास होंगे।

मैंने ऑनलाइन पढ़ा कि validate_date (http://www.railslodge.com/plugins/1160-validates-timeliness) नामक एक आरएसपीसी मैचर होता था जो कि मैं बिल्कुल देख रहा हूं लेकिन जहां तक ​​मैं कह सकता हूं कि इसे हटा दिया गया है।

मेरा सवाल यह है कि मैं अपने परीक्षणों में सुधार कैसे कर सकता हूं, क्या मुझे परीक्षणों को जोड़ने की ज़रूरत है जो थोड़ी सी समय (यानी एक एमएस) कोशिश करें ताकि यह सुनिश्चित किया जा सके कि पास/असफल हो या क्या ऐसा करने का बेहतर तरीका है?

अग्रिम धन्यवाद!

उत्तर

1

आप valid? और errors.messages साथ काम कर सकता था:

  • एक Event कि आपके start_date और end_date
  • के अलावा मान्यता गुजरता सेट start_date और सही क्रम में end_date निर्माण, और जोर event.valid? है कि true
  • start_date औरसेट करें मेंगलत आदेश, और जोर दें कि यह valid? नहीं है और event.errors.messages में सही सत्यापन त्रुटियां शामिल हैं। (ध्यान दें, आप event.errors.messages की जाँच से पहले event.valid? कॉल करनी होगी, अन्यथा वे खाली हो जाएगा)

valid? और 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

इस

validates_date :end_time, :after => [:start_time, Proc.new {1.day.from_now_to_date}] 
validates_date :start_time, :after => Time.now 
प्रयास करें