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 正在删除每个之前的存根设置。因为您正在执行 ||=,所以不会重新创建通知程序,也不会重新创建存根。这反过来意味着当您在第二个规范中调用 should_receive 时,您正在设置一个新的存根。由于这个新存根没有指定的返回值,所以返回 nil。

于 2012-06-14T17:39:38.967 回答