如何使用RSpec测试错误处理?

时间:2016-05-15 17:55:58

标签: ruby rspec

我尝试测试此代码:

mail = Mail.new
mail.from = @from
mail.to = to
<...>
begin
  mail.deliver
rescue
  return false
else
  return true
end

使用RSpec进行错误处理:

it 'should return true if success' do
  expect(mailer.send_confirmation_request(token)).to be true
end

it 'should return false if fails' do
  allow_any_instance_of(Mail).to receive(:deliver).and_raise('Mail error')
  expect(mailer.send_confirmation_request(token)).to be false
end

但它不起作用:第二次测试失败。为什么allow_any_instance_of(和allow(Mail))不能以这种方式运作?怎么测试?我应该修复我的代码以使其更易于测试吗?我可以通过使用rspec double对Mail#new进行存根来测试它,但它会导致存根所有邮件方法并且看起来不是正确的方法。

如果确实重要,我会使用mikel's mail gem并根据他的recommendations进行测试。

2 个答案:

答案 0 :(得分:1)

Mail不会返回Mail::Message的实例,它会返回allow_any_instance_of的实例,因此您在错误的类上调用keytool -list -v -keystore ~/.android/ projectOne.keystore -alias projectOne

我认为这样做是为了简化界面,但它有点违反直觉。

答案 1 :(得分:0)

当您使用expect_any_instance_ or allow_any_instance_`模拟或存根方法时,您实际上将该方法的正常值替换为您在存根中返回的内容。

如果要保留方法调用的原始实现,可以使用and_call_original

相关的RSpec文档: https://www.relishapp.com/rspec/rspec-mocks/v/2-14/docs/message-expectations/calling-the-original-method