我在红宝石中有一个自定义事实,像这样:
Facter.add(:some_random_fact) do
setcode do
output = execute_some_method
if !output.nil? then
begin
pruned_output = output.split("\n")
result = true
rescue
result = false
end
else
result = false
end
end
end
我如何使用rspec编写用于抢救块引发异常的单元测试?
编辑:请让我知道以下测试是否是正确的测试方法
it "return fact as false when begin block raises exception" do
output = double(:output)
allow(output).to receive(:split).with(true).and_raise(RuntimeError.new("error occured"))
expect(Facter.fact(:some_random_fact).vallue).to eq(false)
end
您在这里显示的代码很奇怪,我感到我们缺少上下文,但是总的来说,您可以存根这样的方法来引发错误:
expect(output).to receive(:split).with("\n").and_raise(RuntimeError.new("some error"))
但这是处理事情的一种丑陋方式。如果根据output
的类型有条件地引发错误,则最好找到一种方法将该变量设置为产生错误的值。如何做到这一点,如果不查看代码测试,我无法告诉您。
例如,假设您将所有这些代码都包装在def add_fact(output)
中-然后可以从测试中有意地为output
传递一个引起错误的值,而无需再进行存根分割了(这很奇怪。去做)。这种模式称为“依赖注入”。