如何在 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".