我正在测试一些涉及电子邮件的方法,并且我正在尝试使用模拟邮件程序对象。我显然是以错误的方式进行,因为测试第一次起作用,但是同样的测试随后失败了。如果有人能解释这里发生了什么,我会很感激。感谢。
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)>'
答案 0 :(得分:1)
Rspec为模拟和期望插入设置/拆卸的东西。这确实可以验证是否已满足should_receive
期望并清除在超出单个规范的对象中设置的模拟。例如,如果您在一个规范中存根了User.find,那么您不会期望该存根存在于另一个规范中。
所以在第一个规范结束时,rspec正在删除每个之前的存根设置。因为你正在做|| =,所以Notifier不会被重新创建,也不是存根。这反过来意味着当你在第二个规范中调用should_receive时,你正在设置一个新存根。由于此新存根没有指定的返回值,因此返回nil。