Подтвердить что ты не робот

Как получить трассировку стека из Test:: Unit:: TestCase

Я тестирую некоторый код Ruby и испытываю неудачу Test:: Unit:: TestCase. К сожалению, отчет об отказе только дает мне верхнюю ошибку, а не полную трассировку стека. В частности, он говорит:

 1) Failure:
test_tp_make(TestScripts::TestTpMake) [test/test_scripts.rb:73]:
Exception raised:
<#<NoMethodError: undefined method `[]' for nil:NilClass>>.

Номер строки, на которую делается ссылка (73), представляет собой начало блока assert_nothing_raised в моем тестовом примере, который, в свою очередь, запускает другой блок кода, который, в свою очередь, вызывает большую библиотеку.

Я попытался запустить тест с помощью флага --verbose, к сожалению, это не меняет выход исключения. Я попробовал обратиться к документации Test:: Unit, но, похоже, не перечисляет доступные параметры (например, там ничего не полезно здесь). Поиск в Интернете и StackOverflow выявили некоторые ответы на вопрос о том, как включить трассировку стека в Rails, но это рубиновый код без Rails.

Я мог бы извлечь неисправный код из теста и запустить его вне Test:: Unit, позволяя мне видеть весь вывод. Но будет больно делать это каждый раз, когда у меня будет неудачный тест.

Кто-нибудь знает, как получить Test:: Unit, чтобы дать мне полную трассировку стека?

4b9b3361

Ответ 1

Просматривая код Test:: Unit в Ruby 1.8, кажется, что все ошибки проходят через объект Test:: Unit:: Error, который фильтрует backtrace в методе #long_display. Конфигурация отсутствует, и все бегуны будут использовать те же отфильтрованные трассы.

Патч обезьяны грубой силы, чтобы получить всю трассировку: (я помещаю это в один файл сценария, возможно, вы можете поместить его в тестовый помощник)

require 'test/unit/util/backtracefilter'

module Test::Unit::Util::BacktraceFilter
  def filter_backtrace(backtrace, prefix=nil)
    backtrace
  end
end

И патч обезьяны для Ruby 1.9 (который использует minitest)

def MiniTest.filter_backtrace(bt)
  bt
end

Ответ 2

Используйте это в любом месте вашего класса, чтобы получить полную трассировку стека. Я использовал его в моем случае unit test для отладки моего тестового класса.

rescue => e

puts e.inspect

puts e.backtrace