如何在 ruby 中测试一个简单的救援块
How to test a simple rescue block in ruby
我在 ruby 中有一个自定义事实是这样的:
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
传递一个导致错误的值,并且您不再需要存根拆分(这是一件很奇怪的事情)。这种模式被称为 "dependency injection".
我在 ruby 中有一个自定义事实是这样的:
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
传递一个导致错误的值,并且您不再需要存根拆分(这是一件很奇怪的事情)。这种模式被称为 "dependency injection".