我有一个非常奇怪的问题,使用Minitest将方法分派到错误的类。
我正在帮助维护dnsruby库(https://github.com/alexdalitz/dnsruby),我们有一个间歇性失败的特定测试(https://github.com/alexdalitz/dnsruby/blob/master/test/tc_resolv.rb#L56)。
通过在pry中设置断点,我发现当它失败时,它在内部Ruby getname
类上使用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
类吗?
我们如何解决这个问题?
答案 0 :(得分:0)
通过移除顶层中不应存在的include Dnsruby
来解决问题。 (感谢Ruby社区成员https://github.com/matt-glover发现这个!)
有关详细信息,请访问https://github.com/alexdalitz/dnsruby/issues/112处的Github问题,修复程序位于https://github.com/alexdalitz/dnsruby/pull/121/files的拉取请求中。
有一件事让我感到困惑......我本来期望包括导致Dnsruby :: Resolv类被拉到顶层,但似乎反过来了。