2011-07-27 25 views
12

Timecop'un bir kombinasyonunu kullanmaya çalışıyorum ve data için arşivi nerede olduğunu sorguladım ama Timecop'u zamanın gerçekten dondurması için göremiyorum. Timecop.freeze ve Timecop.freeze (Time.now) denedim, her ikisi de benim spec.now kullanırken zaman biraz kapalıdır.Spesifikasyonumdaki zamanı doğru bir şekilde nasıl dondururum?

Neyi eksik? Yakut 1.9.2, 3.1.0.rc5

Raylar -

hatayı

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')" 

modeli

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

Spec

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

, Ben timcop sanmıyorum ama zaman damgası biçimlerinde bir sorun. Şimdi sadece bu parçayı bulmak için. –

cevap

22

TimeCop Benim kullanım içinde özellikleri her zaman böyle görünüyor:

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

Bir raylar app zaman ile uğraşırken Time.zone vekil (vb Time.zone.now, Time.zone.utc, Time.zone.local,) kullanmak için genellikle iyi bir uygulama da var. Zaman eşleşmeyen yerler'i

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

:

+1

Halihazırda kullanıldığı gibi doğru zaman damgası biçimini görüntülemekle ilgili bir sorun var, ancak Timecop yanıtınız doğru. –

2

Sadece koşuyordu zaman RSpec en expect sözdizimi ile timecop çalıştıran bir sorun vardı. Çözmek için before maddesinde Timecop.freeze koyarım.

(Bu soru eski gerçekleştirmek ve RSpec en expect sözdizimi etrafında değildi, ama asıl soru belirtilen aynı sorunu olan kişilere yardımcı olabilecek bir before bloğuna veya maddeye Timecop.freeze ekleyerek düşünüyorum. Elbette, bu kokan . t bugüne kadar) yeni bir soru sorma ve benim sorum ise buna çok çok benzer olacağını çünkü onu değerli olduğunu yanıtlayan gibi

1

Seyahat görünmek ve TimeHelpers, örnek şunlardır: Bu daha yakın baktığımızda

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

İyi bir nokta çiziyorsunuz, ancak doğrudan soruyu yanıtlamıyorsunuz; Bu nedenle, daha açık olmalısınız: “Timecop” kullanarak değil, bir Rails Helper Method ('travel_to') kullanıyorsunuz ve bu yöntem (diğerleri arasında) * Rails 4.1 * 'den itibaren mevcut. – einjohn

İlgili konular