Ruby instance_eval与load`的混淆

时间:2012-05-29 16:51:01

标签: ruby metaprogramming minitest

我正在尝试在ruby中测试一个方法。它基本上是一个单独的文件:

a.rb:

def my_method
  ...
end

在我的a_spec.rb

require 'minitest/autorun'

Object.instance_eval do
  load("path_to/a.rb")

  def hello_world
    ...
  end
end

当我尝试运行我的测试时,它说my_method是一个私有方法,而我实际上可以直接调用Object.hello_world。是什么给了什么?

另外,有没有更简单的方法来测试使用minitest的普通ruby方法(没有类或模块)?

1 个答案:

答案 0 :(得分:0)

执行上面的加载不会将 a.rb 的方法作为单例方法添加到Object。相反,它将方法添加到全局命名空间。 (你在自我引用Object类的块中进行加载的事实是无关紧要的。)

上面的代码,您应该可以直接在测试中调用* my_method *:

class MyTest <  MiniTest::Unit::TestCase

  def test_my_method
    assert my_method
  end

  def test_hello_world
    assert Object.hello_world
  end
end