tags:

views:

83

answers:

2

Ruby's unit testing framework executes unit tests even though nobody creates unit test object. For example,

in MyUnitTest.rb

require 'test/unit'

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

and when i invoke that script as

ruby MyUnitTest.rb

test_true method gets executed automatically. How is this done?

I am trying to come up with a framework that can do similarly. I dont want "if __ FILE __ == $0" at the end of every module that uses my framework.

thanks.

+4  A: 

Test::Unit uses at_exit for this, which runs code immediately before your application quits:

at_exit do
  puts "printed before quit"
end

.. other stuff

I don't think there is any way to run code specifically after a class or module definition is closed.

Daniel Lucraft
but you can redefine `Class.inherited` for your class to get references to all the subclasses, and then play with them in your `at_exit` hook.
rampion
+1  A: 

Similar to Daniel Lucraft's answer, you could define a finalizer guard to have some code run when the garbage collector runs:

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

But personally I think at_exit is a better fit since its timing is a bit more deterministic.

James A. Rosen