2009-07-15 8 views
4

La structure de test unitaire de Ruby exécute des tests unitaires même si personne ne crée d'objet de test unitaire. Par exemple,Exécuter le code à la fin du module/classe, comme le test/unité de Ruby

dans MyUnitTest.rb

require 'test/unit' 

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

et quand j'invoque ce script comme

ruby MyUnitTest.rb 

méthode test_true est exécuté automatiquement. Comment cela est-il fait? J'essaie de trouver un cadre qui peut faire de même. Je ne veux pas "si __ FICHIER __ == $ 0" à la fin de chaque module qui utilise mon framework.

merci.

Répondre

6

Test::Unit utilise at_exit pour cela, qui exécute le code immédiatement avant votre application se ferme:

at_exit do 
    puts "printed before quit" 
end 

.. other stuff 

Je ne pense pas qu'il y ait un moyen d'exécuter du code spécifique après une définition de classe ou d'un module est fermé.

+0

mais vous pouvez redéfinir 'Class.inherited' pour votre classe afin d'obtenir des références à toutes les sous-classes, puis jouer avec elles dans votre hook' at_exit'. – rampion

1

similaires à Daniel Lucraft's answer, vous pouvez définir un garde finaliseur d'avoir une course de code lorsque le garbage collector fonctionne:

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

Mais personnellement, je pense at_exit est un meilleur ajustement depuis son timing est un peu plus déterministe.

Questions connexes