0

我正在测试我的一个邮件程序,并且我有一个控制器测试,它只是断言邮件程序被调用(与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

由于nil在contact_request 的模板中设置了一个变量,此规范失败。所以看起来......该contact_request方法实际上正在执行和呈现它的模板,即使我已经模拟了该方法。怎么会?

如果它有任何不同,模板在实际应用程序中渲染得很好——在这个特定的规范中,变量只设置为 nil。

4

2 回答 2

1

尝试any_instance从存根链中删除?它不是在您的代码中通过: 调用的 NotificationMailer.contact_request吗? any_instance假设它是在类的实例上调用的,而不是在类本身上。

于 2012-12-12T23:55:08.463 回答
0

好的,我正在模拟NotificationMailer实例的方法,但当然您实际上是在class上调用它。看起来 ActionMailer::Base 正在做一些method_missing 魔术,让您将其称为类方法,即使它被定义为实例方法。

解决方案只是调用should_receive类,而不是实例。

 NotificationMailer.should_receive(:contact_request)
于 2012-12-12T23:56:23.557 回答