Заглушки RSpec, видимо, не очищены после теста - PullRequest
1 голос
/ 10 апреля 2019

Я работал над диагностикой сбоя теста, который происходит только в моей основной ветке. Ниже приведен соответствующий код в упрощенном виде.

Есть услуга:

class Service

  attr_reader :traces

  def initialize
    @traces = []
  end

  def do_work
    @traces << Thread.current.backtrace
    # ... actual work ...
  end

end

И класс, который использует службу:

class Widget

  def get_cached_service
    puts("Getting a cached service!")
    puts("Do I already have one? #{!!@service}")
    @service ||= make_service
  end

  def make_service
    puts("Making a service!")
    Service.new
  end

end

У меня есть тест (который находится в файле widget_spec.rb), который периодически прерывается. Этот тест создает экземпляр Widget и вызывает get_cached_service. Я вижу сообщение Getting a cached service! на консоли, за которым следует Do I already have one? false, но я не вижу сообщение Making a service!.

Кроме того, когда я проверяю атрибут traces возвращенного объекта Service, я нахожу следы стека, полученные из других тестов в моем проекте (например, foo_spec.rb, bar_spec.rb и т. Д.) ).

В нескольких местах я нахожу код:

allow_any_instance_of(Widget)
  .to receive(:make_service).and_return(whatever)

Другие тесты, чьи следы стеков я нахожу, вероятно, заглушают make_service, как это. Но похоже, что заглушка не отменяется после этих испытаний, как всегда должно происходить, насколько я понимаю.

Есть ли какая-либо причина, кроме ошибки в rspec, которая может привести к тому, что заглушка не будет сброшена в конце теста?

1 Ответ

0 голосов
/ 10 апреля 2019

Заглушка почти наверняка очищается, но вы кэшировали поддельный экземпляр в get_cached_service. Ничто не очищает кэшированное значение в @service, и RSpec (по праву) не знает об этом. Таким образом, заглушки make_service недостаточно, если тесты вызывают get_cached_service. У вас есть несколько вариантов:

  • Всегда заглушка get_cached_service вместо или в дополнение к make_service
  • Предоставляет способ очистки кэшированного значения, которое вызывается после каждого теста.
  • Сделайте кэширование настраиваемым каким-либо образом или оберткой вокруг фактической реализации, чтобы кэширование не происходило в тестовом коде.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...