2011-07-27 7 views
12

Próbuję użyć kombinacji Timecop i kwerendy z Arel gdzie_sql do danych, ale nie wydaje mi się, aby Timecop faktycznie zamrozić czas. Próbowałem już Timecop.freeze i Timecop.freeze (Time.now), które są nieco wyłączone, gdy używam Time.now w mojej specyfikacji.Jak prawidłowo zamrozić czas w/Timecop w mojej specyfikacji?

Czego mi brakuje? Ruby 1.9.2, Rails 3.1.0.rc5

-

error

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

modelu

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

Patrząc na to bliżej , Nie sądzę, że jest to timecop, ale problem w formatach znacznika czasu. Teraz po prostu wymyślić ten kawałek. –

Odpowiedz

22

Moja wykorzystanie TimeCop w Specyfikacja zawsze wygląda tak:

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

Jest również ogólnie dobra praktyka, aby korzystać z proxy Time.zone (Time.zone.now, Time.zone.utc, Time.zone.local itp), gdy ma do czynienia z czasem w app szyn.

+1

Wystąpił problem z wyświetleniem prawidłowego formatu znacznika czasu w klauzuli where, ale odpowiedź Timecop jest poprawna. –

2

miałem tylko problem z uruchomieniem Timecop z expect składni rspec kiedy biegałam:

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

Gdzie czasy nie były dopasowane. Aby rozwiązać, umieszczam Timecop.freeze w klauzuli before.

(I uświadomić sobie to pytanie jest starszy i expect składnia rspec nie było wokół, ale myślę, że dodanie Timecop.freeze do bloku before lub klauzuli może pomóc ludziom, którzy mają ten sam problem, o którym mowa w oryginalnym pytanie. Oczywiście, nie robi” t wydawać się zadając nowe pytanie i odpowiadanie warto ponieważ moje pytanie będzie bardzo podobny do tego powyżej)

1

Travel datą i obejmują TimeHelpers, przykład:.

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

Dobrze ci idzie, ale nie odpowiadasz bezpośrednio na to pytanie; w związku z tym powinieneś być bardziej jednoznaczny: nie * używasz 'Timecop', lecz metody Rails Helper (' travel_to') i ta metoda (między innymi) jest dostępna od * Rails 4.1 *. – einjohn

Powiązane problemy