2013-04-12 43 views
13

Tôi đang làm việc để có được một đường ray 3 ứng dụng sẵn sàng sử dụng các múi giờ. Máy phát triển của tôi là ở EDT và các máy chủ tôi đang lưu trữ đang ở trong UTC. Có cách nào trong các thử nghiệm rspec của tôi thay đổi ruby ​​múi giờ của hệ thống đang sử dụng để tôi chạy thử nghiệm sử dụng cùng múi giờ của hệ thống mà không phải thay đổi đồng hồ hệ thống trên máy tính của mình không? Tôi đã xem xét Delorean và Timecop và chúng không phải những gì tôi đang tìm kiếm. Tôi đang tìm kiếm một cái gì đó nhưĐặt thời gian hệ thống trong các kiểm tra rspec mà không thay đổi đồng hồ hệ thống

Time.system_time_zone = "UTC" 

... và sau đó Time.now sẽ trả lại thời gian UTC thay vì bất kỳ múi giờ hệ thống nào của tôi được đặt thành.

Trả lời

10
before {Time.stub(:now) {Time.now.utc}} 

Với điều này, bất cứ nơi nào Time.now được gọi trong thử nghiệm của bạn, nó sẽ trả về thời gian của hệ thống trong UTC.

Ví dụ:

describe Time do 
    before {Time.stub(:now) {Time.now.utc}} 

    it "returns utc as my system's time" do 
    Time.now.utc?.should be_true 
    end 
end 
+1

Cảm ơn Charles, tôi đã hy vọng có một bối cảnh toàn cầu hơn, nhưng điều này thực hiện chính xác những gì tôi cần. –

+0

Thật tuyệt khi có một viên đá quý chính xác ... –

+1

@JoshuaMuheim Tôi tin rằng đá quý [TimeCop] (https://github.com/travisjeffery/timecop) thực hiện điều này. –

-1

Rails cung cấp cho bạn một cách chính xác những gì bạn đang tìm kiếm:

Time.zone = "UTC" 

Nhìn vào http://api.rubyonrails.org/classes/Time.html#method-c-zone-3D để biết thêm thông tin.

+1

này không làm những gì tôi đã được yêu cầu. Điều này cho bạn biết rằng khi bạn đi qua Time.zone để đặt mọi thứ vào múi giờ được chỉ định bởi Time.zone. Tôi đang tìm kiếm để có lần trở lại trong UTC khi bạn sử dụng Time.now. –

+0

Phải, bạn sẽ cần phải gọi 'Time.zone.now' hoặc' Time.current' thay vì 'Time.now' – CubaLibre

+0

Đúng, nhưng toàn bộ ý tưởng của câu hỏi của tôi là đặt thời gian hệ thống trong các bài kiểm tra của tôi thành UTC. Những gì giải pháp của bạn đang làm là nói cho đường ray để chuyển đổi tất cả các lần để UTC thông qua 'Time.zone'. Làm 'Time.now' sẽ vẫn cung cấp cho bạn thời gian trong múi giờ do hệ thống chỉ định. Giải pháp của Charles thực hiện điều này. –

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