Как проверить код в предложении восстановления в rspec - PullRequest
1 голос
/ 20 апреля 2020

У меня есть следующий шаблон в моем коде:

Суть в том, что нам нужно, чтобы ошибки регистрировались в автоматическом режиме, но тесты должны проваливаться, если в коде есть ошибка.

begin
  self.a_method_call
  some_other_object.a_method_that_has_been_refactored
rescue StandardError => e
  Rails.logger.error e.backtrace
end

Если выдается ошибка из-за взаимодействия между self.a_method_call и some_other_object.a_method_that_has_been_refactored, то стандартная ошибка спасения отключит любую ошибку и пройдет любой тест, проверяющий блок кода. Как я могу заставить замолчать спасение, чтобы тесты не прошли, если в предложении начала в коде есть ошибка?

1 Ответ

1 голос
/ 20 апреля 2020

Регистрация ошибок является частью его функциональности. Вместо того, чтобы заставить замолчать спасение, запишите журнал ошибок.

Как написано, вы можете сделать это, издеваясь над регистратором . Используйте with для настройки ожидаемых аргументов Rails.logger.error. Поскольку вы не знаете точно, что будет получено, вы можете использовать различные совпадения, такие как instance_of, чтобы проверить, что вы получили то, что backtrace возвращает, массив.

it 'logs the backtrace as an error' do
  # This comes before you call the method to set up the mock which expects
  # to be called.
  expect(Rails.logger).to receive(:error)
    .with(instance_of(Array))  

  thing.some_method
end

, потому что это заменяет Rails.logger, если что-то еще в процессе thing.some_method вызывает Rails.logger, тест не пройден.

Мы можем сделать это проще с помощью небольшого рефакторинга. Вместо непосредственного использования Rails.logger сделайте его атрибутом.

class SomeClass
  attr_accessor :logger

  def initialize
    @logger = Rails.logger
  end

  def some_method
    a_method_call
    some_other_object.a_method_that_has_been_refactored
  rescue StandardError => e
    logger.error e.backtrace
  end
end

Теперь мы можем специально высмеивать то, что возвращается из thing.logger.

it 'logs the backtrace as an error' do
  # This comes before you call the method to set up the mock which expects
  # to be called.
  expect(thing.logger).to receive(:error)
    .with(instance_of(Array))  

  thing.some_method
end
...