Ruby方法调用错误(顶级模块)类

时间:2017-03-04 15:01:22

标签: ruby module minitest

我有一个非常奇怪的问题,使用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类。 ::ResolvDnsruby::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类吗?

我们如何解决这个问题?

1 个答案:

答案 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类被拉到顶层,但似乎反过来了。