0

メーラーの1つをテストしていて、メーラーが呼び出されたことを表明するコントローラーテストがあります(email_specの例と非常によく似ています)。

# spec/controllers/friendships_controller_spec.rb

it "sends an email when someone sends you a contact request" do
  NotificationMailer.any_instance.should_receive(:contact_request).with(default_user, user)
  xhr :post, :create, {:friendship => {:friend_id => user.id}}
end

nilcontact_requestのテンプレートで変数が設定されているため、この仕様は失敗します。つまりcontact_request、メソッドをモックアップしたにもかかわらず、メソッドは実際にそのテンプレートを実行してレンダリングしているようです。どうして?

違いが生じる場合、テンプレートは実際のアプリケーションで問題なくレンダリングされます。この特定の仕様では、変数はnilにのみ設定されます。

4

2 に答える 2

1

any_instanceスタブ チェーンから削除してみてください。あなたのコードで次のように呼び出されていません NotificationMailer.contact_requestか? any_instanceクラス自体ではなく、クラスのインスタンスで呼び出されたと想定しています。

于 2012-12-12T23:55:08.463 に答える
0

わかりました、私は NotificationMailer のインスタンスのメソッドをモックアップしていましたが、もちろん、実際にはクラスで呼び出します。ActionMailer::Base は、インスタンス メソッドとして定義されているにもかかわらず、これをクラス メソッドとして呼び出せるようにするために、何らかのmethod_missing マジックを実行しているようです。

should_receive解決策は、インスタンスではなくクラスを呼び出すことです。

 NotificationMailer.should_receive(:contact_request)
于 2012-12-12T23:56:23.557 に答える