添加方法 Ruby class 在 MiniTest 中抛出 NoMethodError

Added method to Ruby class throws NoMethodError in MiniTest

那么为什么会这样呢?它必须是一个命名空间错误,我只是不明白它在哪里。我在文件 file.rb

中像这样向 Fixnum 添加了一个方法
module M
  class Fixnum
    def foo
      return true
    end
  end
end

那我来做个测试:

require 'minitest/autorun'
require './file.rb' #the path is correct

class SomeTest < MiniTest::Test
  def test_foo
    assert 3.foo
  end
end

这将依次抛出

NoMethodError: undefined method `foo' for 3:Fixnum

当我 运行 测试时,我一直在摸不着头脑——即使我 include M 为测试包含模块(应用命名空间?)它仍然会抛出错误。我可以很好地使用自定义 类,只有当我尝试向现有 "open class".

添加方法时

是的,你定义了自己的M::Fixnum class,其实和全局命名空间里的::Fixnum没有任何关系。以下将解决一个问题:

module M
  class ::Fixnum
    def foo
      return true
    end
  end
end

5.foo
#⇒ true

请注意,在上面的代码中 module M 没有任何意义,因为代码仍然对全局 Fixnum 进行了猴子修补。此处的代码只是为了展示如何从另一个模块代码内部对全局 class 进行猴子修补。

此外,引入了 Ruby2 refinements, which are likely what you are intended to use