2012-10-15 27 views
6

Làm cách nào để viết thông số kỹ thuật của mình mà không sử dụng phương thức ngủ (1. giây)? Khi tôi loại bỏ giấc ngủ sau đó các bài kiểm tra của tôi bị phá vỡ bởi vì họ đang trở về cùng một dấu thời gian?Làm thế nào tôi nên rspec/kiểm tra một lĩnh vực updated_at mà không cần sử dụng sleep() trong ruby?

tôi có phương pháp lớp sau đây:

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

và sau spec:

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

gì phương pháp set_updated_at bạn làm gì? Tôi không nghĩ rằng bạn đang thực sự thử nghiệm phương thức bỏ qua theo cách đó, để kiểm tra phương thức bỏ qua bạn phải xác minh rằng phương thức bỏ qua: 1: gọi find_or_create_by với dữ liệu đã cho, 2: cuộc gọi set_updated_at trên đối tượng, 3: increments n_skip 1 và 4: lưu đối tượng qs. Những gì bạn đang thử bây giờ là set_updated_at đặt đúng dấu thời gian updated_at trong thử nghiệm của phương thức khác – arieljuod

Trả lời

9

Tôi đã sử dụng Timecop đá quý trong quá khứ để làm thời gian thử nghiệm dựa.

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 

Vì vậy, ví dụ bạn có thể trông giống như:

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

Chúng tôi sử dụng đá quý timecop tại nơi làm việc tại đây @ Do.com –

1

này cũng hoạt động tốt cho kiểm tra rspec. Trong Gemfile của bạn:

require 'timecop', group: :test 

Sau đó, ví dụ, bạn có thể sử dụng rspec để kiểm tra một phạm vi tên mà được mô hình được gọi là truy vấn trong giảm dần updated_at theo thứ tự:

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 
Các vấn đề liên quan