2012-10-30 31 views
7

Tôi là một chút mới đối với Rails và Rspec và vì vậy tôi không chắc chắn làm thế nào để kiểm tra xác nhận ngày tháng đó là chính xác trong mô hình của tôi. Tôi đã thực hiện một sự kiện mô hình có thời gian bắt đầu và kết thúc và có một vài điều kiện quan trọng về thời gian bắt đầu không thể trong quá khứ và thời gian kết thúc phải sau thời gian bắt đầu.Kiểm tra xem mô hình đường ray có xác nhận ngày tháng với RSpec

Để đảm bảo những kiểm chứng thực Tôi đang sử dụng ValidatesTimeliness https://github.com/adzap/validates_timeliness

mô hình của tôi là như sau:

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 

Trong thử nghiệm RSpec của tôi, tôi có:

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 

Tuy nhiên điều này không thực sự kiểm tra rằng ngày bắt đầu của tôi phải trước ngày giờ chính xác. Ví dụ: nếu tôi vô tình sử dụng :today thay vì :now trong mô hình của tôi, các thử nghiệm này cũng sẽ vượt qua.

Tôi đọc trực tuyến mà trước đây từng là một đối sánh RSpec gọi là validate_date (http://www.railslodge.com/plugins/1160-validates-timeliness), đó chính xác là những gì tôi đang tìm kiếm nhưng theo như tôi có thể nói nó đã bị xóa.

Câu hỏi của tôi là làm cách nào để cải thiện các bài kiểm tra, tôi cần thêm các bài kiểm tra để thử thời gian nhỏ nhất (ví dụ: mili giây) để đảm bảo đạt được/thất bại hoặc có cách nào tốt hơn không?

Cảm ơn trước!

Trả lời

1

Bạn có thể làm việc với valid?errors.messages:

  • Xây dựng một Event mà đi xác nhận trừ bạn start_dateend_date
  • Đặt start_dateend_date theo thứ tự đúng, và khẳng định rằng event.valid?true
  • Đặt start_dateend_date trong số sai đơn đặt hàng và xác nhận rằng nó không phải là valid? và rằng event.errors.messages bao gồm các lỗi xác thực phù hợp. (Lưu ý, bạn phải gọi event.valid? trước khi kiểm tra event.errors.messages, nếu không họ sẽ trống)

Ví dụ cho 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

Hãy thử điều này

validates_date :end_time, :after => [:start_time, Proc.new {1.day.from_now_to_date}] 
validates_date :start_time, :after => Time.now 
Các vấn đề liên quan