添加方法 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。
那么为什么会这样呢?它必须是一个命名空间错误,我只是不明白它在哪里。我在文件 file.rb
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。