2015-06-02 17 views
9

Trong phương pháp điều khiển, tôi đặt biến của người dùng activation_sent_at bằng Time.zone.now khi email kích hoạt được gửi tới người dùng đó. Trên máy chủ phát triển, điều này dường như hoạt động (mặc dù biểu thức thời gian trong ứng dụng của tôi là 2 giờ sau giờ địa phương của máy tính của tôi).Kiểm tra tích hợp TimeWithZone & Time.zone.now không thành công

Tôi muốn bao gồm kiểm tra tích hợp để kiểm tra xem activation_sent_at có thực sự được đặt chính xác hay không. Vì vậy, tôi bao gồm các dòng:

assert_equal @user.activation_sent_at, Time.zone.now 

Tuy nhiên, điều này tạo ra lỗi:

No visible difference in the ActiveSupport::TimeWithZone#inspect output. 
You should look at the implementation of #== on ActiveSupport::TimeWithZone or its members. 

Tôi nghĩ rằng nó gợi ý để sử dụng biểu khác cho Time.zone.now trong thử nghiệm của tôi. Tôi đã xem xét các nguồn khác nhau, bao gồm http://api.rubyonrails.org/classes/ActiveSupport/TimeWithZone.html, nhưng tôi không chắc chắn nên làm gì ở đây. Bất kỳ đề xuất nào có thể gây ra lỗi này?

Thông tin bổ sung: Thêm puts Time.zone.nowputs @stakeholder.activation_sent_at xác nhận hai bằng nhau. Không chắc chắn những gì tạo ra lỗi/lỗi.

Trả lời

20

Vấn đề là 2 ngày rất gần nhau nhưng không giống nhau. Bạn có thể sử dụng assert_in_delta

assert_in_delta @user.activation_sent_at, Time.zone.now, 1.second

Đối RSpec, một cách tiếp cận tương tự sẽ được sử dụng be_within:

expect(@user.activation_sent_at).to be_within(1.second).of Time.zone.now

2

Vấn đề là thời gian của bạn là rất gần nhưng không hoàn toàn như nhau. Chúng có thể bị tắt bởi một vài phần nhỏ trong một giây.

Một giải pháp cho các vấn đề như thế này là đá quý thử nghiệm có tên là timecop. Nó cung cấp cho bạn khả năng giả lập Time.now để nó tạm thời trả lại một giá trị cụ thể mà bạn có thể sử dụng để so sánh.

+0

Hài hước, Timecop là vị cứu tinh đầu tiên tôi nghĩ đến khi gặp sự cố này, nhưng nó không giúp ích gì. Buồn cười. – bbozo

+0

Vấn đề là ngay cả khi bạn đóng băng thời gian, nó không giúp đỡ - có lẽ vì một số trôi dạt infinitesimal rằng bất kỳ số học là lúc chơi không thể so sánh đáng tin cậy. Tuy nhiên, khi tôi đặt thời gian cho một thời điểm cụ thể mà tôi chọn với số milisecond được làm tròn, tắt, sau đó nó hoạt động, tức là 'Timecop.freeze' không thành công và 'Timecop.freeze Time.parse (" 2016-09-13 18:26 : 09 +0200 ")' works' – bbozo

+0

Nếu bạn cập nhật câu trả lời, tôi sẽ +1 – bbozo

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