Это определенно возможно - на самом деле, есть даже способ для этого! Просто добавьте это где-нибудь в своем коде до того момента, когда вы хотите начать регистрировать вещи:
set_trace_func proc { |event, file, line, id, binding, classname|
printf "%8s %s:%-2d %10s %8s\n", event, file, line, id, classname
}
Секретный соус, который вы хотите получить, Kernel#set_trace_func
, как указано выше:
- set_trace_func (proc) => proc
- set_trace_func (nil) => nil
Устанавливает proc
в качестве обработчика для трассировки или отключает трассировку, если параметр nil
. proc
принимает до шести параметров: имя события, имя файла, номер строки, идентификатор объекта, привязку и имя класса. proc
вызывается всякий раз, когда происходит событие. События: c-call
(вызов подпрограммы языка C), c-return
(возврат из подпрограммы языка C), call
(вызов метода Ruby), class
(запуск определения класса или модуля), end
(завершить определение класса или модуля), line
(выполнить код в новой строке), raise
(вызвать исключение) и return
(возврат из метода Ruby). Трассировка отключена в контексте proc.
Вот удобный пример:
class Test
def test
a = 1
b = 2
end
end
set_trace_func proc { |event, file, line, id, binding, classname|
printf "%8s %s:%-2d %10s %8s\n", event, file, line, id, classname
}
t = Test.new
t.test
(Примечание: не пытайтесь сделать это в irb
, если вам не нужен огромный экран с прокруткой текста.) В результате получается:
line test.rb:11 false
c-call test.rb:11 new Class
c-call test.rb:11 initialize Object
c-return test.rb:11 initialize Object
c-return test.rb:11 new Class
line test.rb:12 false
call test.rb:2 test Test
line test.rb:3 test Test
line test.rb:4 test Test
return test.rb:4 test Test
Вы можете поэкспериментировать с приведенной выше строкой форматирования, чтобы получить только те результаты, которые вы хотите зарегистрировать (например, похоже, что вас интересуют только call
события). Надеюсь, что это поможет, и удачи в прохождении всех этих юнит-тестов!