在Module / Class的末尾执行代码,比如Ruby test / unit

时间:2009-07-15 05:05:42

标签: ruby

Ruby的单元测试框架执行单元测试,即使没有人创建单元测试对象。例如,

MyUnitTest.rb中的

require 'test/unit'

class MyUnitTest < Test::Unit::TestCase
    def test_true
        assert true
    end
end

当我以

的形式调用该脚本时
ruby MyUnitTest.rb

test_true方法自动执行。这是怎么做到的?

我正在尝试提出一个类似的框架。我不想在使用我的框架的每个模块的末尾“if __ FILE __ == $ 0”。

感谢。

2 个答案:

答案 0 :(得分:6)

Test::Unit使用at_exit,在应用程序退出之前立即运行代码:

at_exit do
  puts "printed before quit"
end

.. other stuff

我认为在关闭类或模块定义后,没有任何方法可以专门运行代码。

答案 1 :(得分:1)

Daniel Lucraft's answer类似,您可以定义终结器防护,以便在垃圾收集器运行时运行一些代码:

ObjectSpace.define_finalizer(MyClass, lambda {
  puts "printed before MyClass is removed from the Object space"
})

但我个人认为at_exit更合适,因为它的时间安排更具确定性。