2012-10-15 11 views
6

Come posso scrivere le mie specifiche senza utilizzare il metodo sleep (1.secondo)? Quando rimuovo il sonno, i miei test si interrompono perché restituiscono lo stesso timestamp?Come potrei rspec/testare un campo updated_at senza usare sleep() in ruby?

Ho il seguente metodo della classe:

def skip 
qs = find_or_create_by(user_id: user_id) 
qs.set_updated_at 
qs.n_skip += 1 
qs.save! 
end 

e seguenti specifiche:

qs = skip(user.id) 
    sleep(1.second) 
    qs2 = skip(user.id) 
    qs.should_not be_nil 
    qs2.should_not be_nil 
    (qs.updated_at < qs2.updated_at).should be_true 
+0

che cosa fa il tuo metodo set_updated_at fare? Non penso che tu stia veramente testando il metodo skip in questo modo, per testare il metodo skip devi verificare il metodo skip: 1: chiama find_or_create_by con i dati dati, 2: chiama set_updated_at sull'oggetto, 3: increments n_skip da 1 e 4: salva l'oggetto qs. Quello che stai testando ora è che set_updated_at imposta il timestamp aggiornato_attuale corretto nel test di un altro metodo – arieljuod

risposta

9

Ho usato il Timecop gemma in passato per fare test basato tempo.

require 'timecop' 
require 'test/unit' 

class MyTestCase < Test::Unit::TestCase 
    def test_mortgage_due_in_30_days 
    john = User.find(1) 
    john.sign_mortgage! 
    assert !john.mortgage_payment_due? 
    Timecop.travel(Time.now + 30.days) do 
     assert john.mortgage_payment_due? 
    end 
    end 
end 

Così il vostro esempio può apparire come:

qs = skip(user.id) 

Timecop.travel(Time.now + 1.minute) do 
    qs2 = skip(user.id) 
end 

qs.should_not be_nil 
qs2.should_not be_nil 
(qs.updated_at < qs2.updated_at).should be_true 
+0

Utilizziamo timecop gem al lavoro qui @ Do.com –

1

Questo funziona bene anche per i test RSpec. Nel vostro Gemfile:

require 'timecop', group: :test 

Quindi, ad esempio, è possibile utilizzare RSpec per testare un ambito denominato che ottiene modello chiamato query in ordine decrescente updated_at ordine:

require 'timecop' 
require 'spec_helper' 

describe Query do 

    # test the named scopes for ordering and searching 
    describe 'when a query is searched or sorted' do 

    before :each do 
     @query1 = create(:query) 
     Timecop.travel(Time.now + 1.minute) do 
     @query2 = create(:query) 
     end 
     Timecop.travel(Time.now + 2.minute) do 
     @query3 = create(:query) 
     end 
    end 

    it 'should be listed in descending updated_at order' do 
     @queries = Query.order_by_latest 
     @queries.first.should == @query3 
     @queries.last.should == @query1 
    end 

    end 
end 
Problemi correlati