0

電子メールを含むいくつかのメソッドをテストしており、モックメーラーオブジェクトを使用しようとしています。テストは最初は機能しますが、その後はまったく同じテストが失敗するため、私は明らかに間違った方向に進んでいます。ここで何が起こっているのか説明していただければ幸いです。ありがとう。

describe SentMessage do
  before(:each) do
    Notifier ||= mock('Notifier', :send_generic => true)
  end    
    it "Sends an email" do
      Notifier.should_receive(:send_generic).with(['a@contact.com'], 'test')
      Notifier.send_generic(['a@contact.com'], 'test').should_not be_nil
    end

    it "Sends an email" do
      Notifier.should_receive(:send_generic).with(['a@contact.com'], 'test')
      Notifier.send_generic(['a@contact.com'], 'test').should_not be_nil
    end
end

結果:

Failures:
1) SentMessage Sends an email
   Failure/Error: Notifier.send_generic(['a@contact.com'], 'test').should_not be_nil
    expected: not nil
        got: nil
 # ./spec/models/test.rb:14:in `block (2 levels) in <top (required)>'
4

1 に答える 1

1

Rspec は、モックと期待値のセットアップ/ティアダウンを挿入します。これは、should_receive期待が満たされていることを確認し、単一の仕様を超えて耐えるオブジェクトに設定されたモックをクリアするようなものです。たとえば、ある仕様で User.find をスタブ化した場合、そのスタブが別の仕様に存在するとは思わないでしょう。

そのため、最初の仕様の最後で、rspec は各前のスタブ設定を削除しています。||= を実行しているため、Notifier は再作成されず、スタブも再作成されません。これは、2 番目の仕様で should_receive を呼び出すときに、新しいスタブを設定していることを意味します。この新しいスタブには戻り値が指定されていないため、nil が返されます。

于 2012-06-14T17:39:38.967 に答える