gpt4 book ai didi

ruby-on-rails-3 - Rspec 误报,因为在被测试的代码中拯救了失败异常

转载 作者:行者123 更新时间:2023-12-04 07:19:37 25 4
gpt4 key购买 nike

我有一个我预计会失败的 rspec 测试,但它正在通过,因为它正在测试的代码挽救了 rspec 引发的异常。下面是一个例子:

class Thing do

def self.method_being_tested( object )
# ... do some stuff

begin
object.save!
rescue Exception => e
# Swallow the exception and log it
end
end

end

在 rspec 文件中:
describe "method_being_tested" do
it "should not call 'save!' on the object passed in" do
# ... set up the test conditions

mock_object.should_not_receive( :save! )
Thing.method_being_tested( mock_object )
end
end

我知道执行到达“object.save!”正在测试的方法的行,因此测试应该失败,但测试通过。在救援块中使用调试器,我发现以下内容:
(rdb:1) p e # print the exception object "e"
#<RSpec::Mocks::MockExpectationError: (Mock "TestObject_1001").save!
expected: 0 times
received: 1 time>

所以基本上测试失败了,但是失败被它试图测试的代码抑制了。我无法找到一种可行的方法来阻止此代码吞下 Rspec 异常而不以某种方式损害代码。我不希望代码显式检查异常是否是 Rspec 异常,因为这是糟糕的设计(应该为代码编写测试,永远不应该为测试编写代码)。但我也无法检查异常是否是我希望它捕获的任何特定类型,因为我希望它捕获任何可能在正常生产环境中引发的异常。

在我之前一定有人遇到过这个问题!请帮我找到解决办法。

最佳答案

假设代码按原样正确:

describe "method_being_tested" do
it "should not call 'save!' on the object passed in" do
# ... set up the test conditions
calls = 0
mock_object.stub(:save!) { calls += 1 }
expect {Thing.method_being_tested(mock_object)}.to_not change{calls}
end
end

如果不需要绝对捕获所有异常,包括 SystemExit , NoMemoryError , SignalException等(来自@vito-botta 的输入):
begin
object.save!
rescue StandardError => e
# Swallow "normal" exceptions and log it
end
StandardErrorrescue 捕获的默认异常级别.

关于ruby-on-rails-3 - Rspec 误报,因为在被测试的代码中拯救了失败异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7434339/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com