我尝试测试此代码:
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进行测试。
答案 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