Je veux tester une fonction sur l'un de mes modèles qui génère des erreurs spécifiques. La fonction ressemble à ceci:
def merge(release_to_delete)
raise "Can't merge a release with itself!" if( self.id == release_to_delete.id )
raise "Can only merge releases by the same artist" if( self.artist != release_to_delete.artist )
#actual merge code here
end
Maintenant, je veux affirmer que lorsque j'appelle cette fonction avec un paramètre qui provoque chacune de ces exceptions, les exceptions sont réellement levées. Je regardais la documentation ActiveSupport, mais je ne trouvais rien de prometteur. Des idées?
Les tests unitaires ne sont donc pas vraiment dans le support actif. Ruby est livré avec un cadre xunit typique dans les bibliothèques standard (Test :: Unit dans Ruby 1.8.x, MiniTest dans Ruby 1.9), et le contenu d'ActiveSupport ajoute simplement du contenu à il.
Si vous utilisez Test :: Unit/MiniTest
assert_raise(Exception) { whatever.merge }
si vous utilisez rspec (malheureusement mal documenté, mais beaucoup plus populaire)
lambda { whatever.merge }.should raise_error
Si vous voulez cocher le Exception
soulevé:
exception = assert_raises(Exception) { whatever.merge }
assert_equal( "message", exception.message )
Pour vous assurer qu'aucune exception n'est levée (ou gérée avec succès), faites à l'intérieur de votre scénario de test:
assert_nothing_raised RuntimeError do
whatever.merge
end
Pour vérifier que l'erreur est déclenchée, faites à l'intérieur de votre scénario de test:
assert_raise RuntimeError do
whatever.merge
end
Juste un avertissement, whatever.merge
est le code qui déclenche l'erreur (ou non, selon le type d'assertion).