2

だから私の理解に基づいて、あなたがするとき私は信じています

Resque.inline = Rails.env.test?

resqueタスクは同期的に実行されます。コールバック中にエンキューを取得するresqueタスクのテストを書いていafter_commitます。

after_commit :enqueue_several_jobs

#class PingsEvent < ActiveRecord::Base
...
   def enqueue_several_jobs
      Resque.enqueue(PingFacebook, self.id)
      Resque.enqueue(PingTwitter, self.id)
      Resque.enqueue(PingPinterest, self.id)
   end

.performResqueタスククラスの方法では、私はを実行Rails.logger.infoしています。テストでは、次のようなことを実行しています。

..
Rails.logger.should_receive(:info).with("PingFacebook sent with id #{dummy_event.id}")
PingsEvent.create(params)

そして、私はとについて同じテストをPingTwitterしていPingPinterestます。

すべてのresqueジョブが実行される前にテストが実際に終了したように見えるため、2番目と3番目の期待値で失敗します。最初のテストだけが実際に合格します。次に、RSpecは、他の2つのテストでは受信しMockExpectationErrorなかっRails.loggerたという通知をスローします。.info誰もがこれを以前に経験したことがありますか?

編集

誰かがそのshould_receiveように振る舞い、代わりmockに私がすべきだと述べ.exactly(n).timesました。以前にこれを明確にしなかったことをお詫びしますが、私はさまざまなブロックで私の期待を持っており、1つのブロックで次のブロックのためにそれを模倣するとitは思わないのですか?私がこれについて間違っているかどうか私に知らせてください。should_receiveitit

4

2 に答える 2

2
class A
  def bar(arg)
  end

  def foo
    bar("baz")
    bar("quux")
  end
end

describe "A" do
  let(:a) { A.new }

  it "Example 1" do
    a.should_receive(:bar).with("baz")
    a.foo # fails 'undefined method bar'
  end
  it "Example 2" do
    a.should_receive(:bar).with("quux")
    a.foo # fails 'received :bar with unexpected arguments
  end
  it "Example 3" do
    a.should_receive(:bar).with("baz")
    a.should_receive(:bar).with("quux")
    a.foo # passes
  end
  it "Example 4" do
    a.should_receive(:bar).with(any_args()).once
    a.should_receive(:bar).with("quux")
    a.foo # passes
  end
end

スタブのように、メッセージの期待はメソッドの実装を置き換えます。期待が満たされると、オブジェクトはメソッド呼び出しに再度応答しなくなります。これにより、「未定義のメソッド」が発生します(例1のように)。

例2は、引数が正しくないために期待値が失敗した場合に何が起こるかを示しています。

例3は、同じメソッドの複数の呼び出しをスタブ化する方法を示しています。つまり、受信した順序で正しい引数を使用して各呼び出しをスタブ化します。

any_args()例4は、ヘルパーを使用してこの結合をいくらか減らすことができることを示しています。

于 2012-08-28T02:42:15.250 に答える
1

使用should_receiveはモックのように動作します。異なる引数を持つ同じオブジェクトに複数の期待を持つことは機能しません。Rails.logger.should_receive(:info).exactly(3).timesあなたがあなたのスペックへの期待を変えるならば、おそらく過ぎ去るでしょう。

そうは言っても、これらの仕様についてログに記録されているものよりも適切な何かを主張したい場合は、複数のターゲットを絞った期待を持つことができます。

Rails.logger仕様間で取り壊されることはないので、期待が異なる例にあるかどうかは関係ありません。2つの別々の例でロガーのオブジェクトIDを吐き出すことは、これを示しています。

it 'does not tear down rails logger' do
  puts Rails.logger.object_id # 70362221063740
end

it 'really does not' do
  puts Rails.logger.object_id # 70362221063740
end
于 2012-08-27T22:07:37.700 に答える