6

sleep(1.second) メソッドを使用せずに仕様を作成するにはどうすればよいですか? スリープを削除すると、同じタイムスタンプが返されるため、テストが中断されますか?

私は次のクラスメソッドを持っています:

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
4

2 に答える 2

9

時間ベースのテストを行うために、過去にTimecop gemを使用しました。

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
于 2012-10-15T22:57:17.037 に答える
2

これは、rspec テストにも適しています。Gemfile で:

require 'timecop', group: :test

次に、たとえば、rspec を使用して、クエリと呼ばれるモデルを updated_at の降順で取得する名前付きスコープをテストできます。

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
于 2013-07-28T23:11:57.257 に答える