0

2 つの「サブスクライバー」インスタンスでの呼び出しを想定するテストをセットアップしています。

  it "sends out sms to all the subscribers" do
    @user.subscribers.create!
    @user.subscribers.create!

    Subscriber.any_instance.should_receive(:send_message).with(@message).times(2)
    post :create, {:broadcast => valid_attributes}   
  end

実際のコードは次のとおりです。

  def create
    @broadcast = Broadcast.new(params[:broadcast])
    current_user.subscribers.each do |subscriber|
      subscriber.send_message(@broadcast.message)
    end

    ...

エラー:

  Failure/Error: post :create, {:broadcast => valid_attributes}
     ArgumentError:
       wrong number of arguments (1 for 0)
     # ./app/controllers/broadcasts_controller.rb:41:in `block in create'
     # ./app/controllers/broadcasts_controller.rb:40:in `create'
     # ./spec/controllers/broadcasts_controller_spec.rb:73:in `block (4 levels) in <top (required)>'

何らかの理由で、行を追加すると: Subscriber.any_instance.should_receive(:send_message).with(@message).times(2)、そのエラーメッセージで失敗します。その行を削除すると、テストはスムーズに実行されます (引数の数が間違っている問題はありません)。私は何を間違っていますか?

4

1 に答える 1

0

あなたが得ているエラーは、「times」メソッドが他の「受信カウント」期待の1つにチェーンされていると予想されるためです。次のいずれかを使用できます。

should_receive(:send_message).with(@message).exactly(2).times
should_receive(:send_message).with(@message).at_most(2).times

「times」メソッドを必要としない他の代替手段のいずれかを使用することもできます。

should_receive(:send_message).with(@message).twice
should_receive(:send_message).with(@message).at_most(:twice)

詳細については、rspec-mocks のドキュメントを参照してください。

サブスクライバーを作成する前に、期待値を設定する必要がある場合があります。

it "sends out sms to all the subscribers" do
  Subscriber.any_instance.should_receive(:send_message).with(@message).twice

  @user.subscribers.create!
  @user.subscribers.create!

  post :create, {:broadcast => valid_attributes}   
end
于 2012-09-04T23:33:11.897 に答える