Как протестировать простой блок спасения в ruby - PullRequest
0 голосов
/ 29 мая 2020

У меня есть специальный факт в 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

Как мне написать модульный тест с использованием rspe c для блока восстановления, чтобы вызвать исключение?

РЕДАКТИРОВАТЬ: Пожалуйста, дайте мне знать, является ли приведенный ниже тест правильным способом его проверки

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

1 Ответ

2 голосов
/ 29 мая 2020

Код, который вы здесь показали, выглядит странно, и у меня такое ощущение, что нам не хватает контекста, но в целом вы можете заглушить метод, вызывающий ошибку, например:

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

но это это своего рода уродливый способ go о вещах. Если ошибка возникает условно в зависимости от типа output, то лучше найти способ установить для этой переменной значение, вызывающее ошибку. Как это сделать, я не могу сказать вам, не увидев тест вашего кода.

Например, скажем, вы обернули весь этот код в def add_fact(output) - тогда из ваших тестов вы можете намеренно передать ошибку -приводящее значение для output, и вам больше не нужно разделять заглушки (что довольно странно). Этот шаблон известен как «внедрение зависимостей».

...