Как протестировать простой блок восстановления в 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

person Yong zhu    schedule 29.05.2020    source источник
comment
Я бы попытался назначить nil output перед запуском спецификации, потому что nil.spilt вызовет NoMethodError (undefined method 'split' for nil:NilClass).   -  person spickermann    schedule 29.05.2020
comment
Ваш пример кода кажется довольно неполным. Например, есть присваивания, но переменные потом не используются. Скорее всего, вы получите лучшие ответы, если покажете свой реальный код. (вы, вероятно, можете избежать обработки исключений)   -  person Stefan    schedule 29.05.2020


Ответы (1)


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

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

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

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

person max pleaner    schedule 29.05.2020