RSpec should_receive正在使用Mailer中的原始方法,即使我没有告诉它

时间:2012-12-12 23:43:48

标签: ruby-on-rails-3 rspec

我正在测试我的一个邮件程序,我有一个控制器测试,只是断言邮件程序被调用(非常类似于the example from 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

由于在contact_request模板中将变量设置为nil,此规范失败。所以看起来...... contact_request方法实际上正在执行并呈现其模板,即使我已经模拟了方法。怎么样?

如果它有任何区别,模板在实际应用程序中渲染得很好 - 该变量在此特定规范中仅设置为nil。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

解决方案就是在类上调用should_receive,而不是实例。

 NotificationMailer.should_receive(:contact_request)