RSpec Mocking Mailer - 第二次调用失败

时间:2012-06-14 14:21:43

标签: ruby-on-rails rspec mocking actionmailer

我正在测试一些涉及电子邮件的方法,并且我正在尝试使用模拟邮件程序对象。我显然是以错误的方式进行,因为测试第一次起作用,但是同样的测试随后失败了。如果有人能解释这里发生了什么,我会很感激。感谢。

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)>'

1 个答案:

答案 0 :(得分:1)

Rspec为模拟和期望插入设置/拆卸的东西。这确实可以验证是否已满足should_receive期望并清除在超出单个规范的对象中设置的模拟。例如,如果您在一个规范中存根了User.find,那么您不会期望该存根存在于另一个规范中。

所以在第一个规范结束时,rspec正在删除每个之前的存根设置。因为你正在做|| =,所以Notifier不会被重新创建,也不是存根。这反过来意味着当你在第二个规范中调用should_receive时,你正在设置一个新存根。由于此新存根没有指定的返回值,因此返回nil。