Я работал над диагностикой сбоя теста, который происходит только в моей основной ветке. Ниже приведен соответствующий код в упрощенном виде.
Есть услуга:
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, которая может привести к тому, что заглушка не будет сброшена в конце теста?