У меня очень странная проблема с отправкой метода в неправильный класс с помощью Minitest.
Я помогаю поддерживать библиотеку dnsruby (https://github.com/alexdalitz/dnsruby) и у нас есть конкретный тест, который периодически не работает (https://github.com/alexdalitz/dnsruby/blob/master/test/tc_resolv.rb#L56).
Установив точку останова в pry, я обнаружил, что в случае сбоя он использует метод getname
для внутреннего класса Ruby Resolv
, а не класс Dnsruby::Resolv
, указанный в коде. И ::Resolv
, и Dnsruby::Resolv
, похоже, указывают на внутренний класс Ruby Resolv
:
[1] pry(#<TestResolv>)> ::Resolv.object_id
=> 70320518250220
[2] pry(#<TestResolv>)> Dnsruby::Resolv.object_id
=> 70320518250220
Ошибка не возникает, когда тест запускается сам по себе (ruby test/tc_resolv.rb
). В сочетании с другими тестами (с использованием ruby test/ts_online.rb
и изменением списка запускаемых тестовых файлов) он часто дает сбой, но иногда нет. Единственный обнаруженный мной фактор, который, по-видимому, коррелирует с ошибкой, — это объем выполняемого тестового кода; чем больше тестов выполняется, тем больше вероятность того, что они потерпят неудачу.
Когда тест проходит успешно, ::Resolv
даже не определяется:
[1] pry(#<TestResolv>)> ::Resolv.object_id
NameError: uninitialized constant Resolv
Я искал в нашей кодовой базе require 'resolv'
, но не нашел. Возможно, это требуется для другой библиотеки, которую мы используем. Однако даже в этом случае не следует ли Dnsruby::
в Dnsruby::Resolv
указывать наш настроенный класс Resolv
?
Как мы можем это исправить?
TracePoint
илиset_trace_func
, чтобы проверить, не переопределен ли он каким-либо классом. - person phoet   schedule 05.03.2017Celluloid.boot
, но нетCelluloid.shutdown
. - person phoet   schedule 05.03.2017