2012-10-15 10 views
6

नींद (1. सेकंड) विधि का उपयोग किये बिना मैं अपना स्पेक कैसे लिखूं? जब मैं नींद को हटा देता हूं तो मेरे परीक्षण तोड़ते हैं क्योंकि वे एक ही समय टिकट वापस कर रहे हैं?रूबी में नींद() का उपयोग किये बिना मैं एक अपडेटेड_ट फ़ील्ड को आरएसपीसी/टेस्ट कैसे करूं?

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

और निम्नलिखित कल्पना:

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

अपने set_updated_at विधि क्या करना है:

require 'timecop', group: :test 

फिर, उदाहरण के लिए, आप rspec एक नामित गुंजाइश है कि आदेश updated_at अवरोही क्रम में मॉडल प्रश्नों कहा जाता हो जाता है परीक्षण करने के लिए उपयोग कर सकते हैं? मुझे नहीं लगता कि आप वास्तव में स्किप विधि का परीक्षण कर रहे हैं, जिसकी जांच करने के लिए आपको स्किप विधि का परीक्षण करना है: 1: दिए गए डेटा के साथ find_or_create_by पर कॉल करें, 2: ऑब्जेक्ट पर set_updated_at कॉल करें, 3: increments n_skip 1 और 4 द्वारा: qs ऑब्जेक्ट को बचाता है। अब आप परीक्षण कर रहे हैं कि set_updated_at किसी अन्य विधि के परीक्षण में सही अपडेट_ट टाइमस्टैम्प सेट करता है – arieljuod

उत्तर

9

मैं समय आधारित परीक्षण करने के लिए अतीत में Timecop मणि का उपयोग किया है

मैं निम्नलिखित वर्ग विधि है।

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 

तो अपने उदाहरण लग सकता है जैसे:

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

हम यहां काम पर टाइमकॉप मणि का उपयोग करते हैं @ Do.com –

1

यह भी rspec परीक्षण के लिए अच्छी तरह से काम करता है। अपने Gemfile में:

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