2009-07-15 21 views
4

即使沒有人創建單元測試對象,Ruby的單元測試框架也會執行單元測試。例如,在模塊/類結束時執行代碼,如Ruby測試/單元

在MyUnitTest.rb

require 'test/unit' 

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

,當我調用該腳本作爲

ruby MyUnitTest.rb 

test_true方法被自動執行。這是如何完成的?

我想要一個可以做類似的框架。我不希望「如果__ FILE __ == $ 0」在每個使用我的框架模塊的末尾。

謝謝。

回答

6

Test::Unit使用at_exit這一點,它會立即運行代碼的應用程序退出之前:

at_exit do 
    puts "printed before quit" 
end 

.. other stuff 

我不認爲有任何的方式來運行一個類或模塊定義被關閉後,專門代碼。

+0

但您可以爲您的類重新定義`Class.inherited`以獲得對所有子類的引用,然後在您的`at_exit`鉤子中與它們一起玩。 – rampion 2009-07-15 11:16:41

1

Daniel Lucraft's answer類似,您可以定義一個終結後衛有一些代碼運行的垃圾收集器運行時:

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

但我個人認爲at_exit是一個更適合,因爲它的時間是比較確定的一點。