如何在红宝石中测试简单的救援块

问题描述 投票:0回答:1

我在红宝石中有一个自定义事实,像这样:

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
ruby unit-testing rspec puppet rescue
1个回答
2
投票

您在这里显示的代码很奇怪,我感到我们缺少上下文,但是总的来说,您可以存根这样的方法来引发错误:

expect(output).to receive(:split).with("\n").and_raise(RuntimeError.new("some error"))

但这是处理事情的一种丑陋方式。如果根据output的类型有条件地引发错误,则最好找到一种方法将该变量设置为产生错误的值。如何做到这一点,如果不查看代码测试,我无法告诉您。

例如,假设您将所有这些代码都包装在def add_fact(output)中-然后可以从测试中有意地为output传递一个引起错误的值,而无需再进行存根分割了(这很奇怪。去做)。这种模式称为“依赖注入”。

© www.soinside.com 2019 - 2024. All rights reserved.