2011-07-27 23 views
12

Tôi đang cố gắng sử dụng kết hợp Timecop và truy vấn dữ liệu where_sql arel, nhưng tôi dường như không thể có được Timecop để thực sự đóng băng thời gian. Tôi đã thử Timecop.freeze và Timecop.freeze (Time.now), cả hai đều hơi tắt khi sử dụng Time.now trong spec của tôi.Làm thế nào để tôi đóng băng đúng thời gian với Timecop trong thông số kỹ thuật của tôi?

Tôi đang thiếu gì? Ruby 1.9.2, Rails 3.1.0.rc5

-

lỗi

Failure/Error: Game.unreleased.arel.where_sql.should eq("WHERE (release_date > '#{Time.now}')") 


    expected "WHERE (release_date > '0000-01-01 00:00:00 -0500')" 
    got "WHERE (release_date > '0000-01-01 05:00:00.000000')" 

mô hình

scope :unreleased, lambda { |limit = 4| where('release_date > ?', Time.now). 
             order('release_date asc'). 
             limit(limit) } 

đặc tả

it "should retrieve games with a release date later than today" do 
    Timecop.freeze 
    Game.unreleased.arel.where_sql.should eq("WHERE (release_date > '#{Time.now}')") 
end 
+0

Nhìn gần hơn này , Tôi không nghĩ rằng đó là timecop nhưng là một vấn đề trong định dạng dấu thời gian. Bây giờ để chỉ ra rằng mảnh ra. –

Trả lời

22

sử dụng của tôi về Timecop trong thông số kỹ thuật luôn giống như sau:

Timecop.travel(Time.zone.local(2010, 6, 1, 13, 0, 0)) do 
    .. time sensitive spec here .. 
end 

Thực tiễn tốt nhất là sử dụng proxy Time.zone (Time.zone.now, Time.zone.utc, Time.zone.local, v.v.) khi xử lý thời gian trong ứng dụng đường ray.

+1

Vẫn còn một vấn đề với hiển thị định dạng dấu thời gian chính xác như được sử dụng trong mệnh đề where, nhưng câu trả lời Timecop của bạn là chính xác. –

2

Tôi chỉ có một vấn đề chạy Timecop với cú pháp expect RSpec khi tôi đã chạy:

it "updates :completed_at" do 
    Timecop.freeze 
    expect(@task.completed_at).to eq(Time.zone.now) 
end 

Trường hợp thời gian không phù hợp. Để giải quyết, tôi đặt Timecop.freeze trong mệnh đề before.

(Tôi nhận ra câu hỏi này là lớn tuổi và cú pháp expect RSpec là không xung quanh, nhưng tôi nghĩ rằng việc thêm Timecop.freeze đến một khối before hoặc khoản có thể giúp những người có cùng một vấn đề được đề cập trong câu hỏi ban đầu. Chắc chắn, nó doesn' t dường như hỏi một câu hỏi mới và trả lời nó là giá trị kể từ khi câu hỏi của tôi sẽ rất rất giống với một ở trên)

1

Travel đến ngày và bao gồm TimeHelpers, ví dụ:.

include ActiveSupport::Testing::TimeHelpers 

let!(:archived_date) { Time.zone.now } 

travel_to(archived_date) do 
    expect(OrderService.getOrder(some_old_order).archived_at).to eq Time.zone.now 
end 
+0

Bạn đang làm một điểm tốt, nhưng bạn không trả lời trực tiếp câu hỏi; do đó, bạn nên rõ ràng hơn: Bạn * không * sử dụng 'Timecop' nhưng phương thức Rails Helper (' travel_to') và phương thức này (trong số những thứ khác) có sẵn dưới dạng * Rails 4.1 *. – einjohn

Các vấn đề liên quan