Rails ActiveSupport: Comment affirmer qu'une erreur est générée?
Je suis désireux de tester une fonction sur un de mes modèles qui jette les erreurs spécifiques. La fonction ressemble à quelque chose comme 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 faire une assertion que lorsque j'appelle cette fonction avec un paramètre qui pousse chacun de ces exceptions, que les exceptions réellement obtenir la levée. Je regardais ActiveSupport de la documentation, mais je n'ai pas trouver quelque chose de prometteur. Des idées?
Vous devez vous connecter pour publier un commentaire.
Donc les tests unitaires n'est pas vraiment dans activesupport. Ruby est livré avec un typique xunit cadre de la norme libs (Test::Unit en ruby 1.8.x, MiniTest en ruby 1.9), et les trucs en activesupport ajoute juste quelques trucs à elle.
Si vous êtes à l'aide de Test::Unit/MiniTest
si vous utilisez rspec (malheureusement mal documenté, mais de façon de plus en plus populaire)
Si vous voulez vérifier le soulevées
Exception
:assert_raise(Exception() { whatever.merge })
, c'est à dire qu'il cherche une méthode appeléeException
qui est appelée avec le bloc donné. Ajouter les parenthèses décide que l'ambiguïté. (Déjà fixé la réponse)expect { whatever.merge }.to raise_error
(relishapp.com/rspec/rspec-expectations/v/3-1/docs/...)Pour s'assurer qu'aucune exception n'est levée (ou est géré avec succès) de faire à l'intérieur de votre cas de test:
Pour vérifier que l'erreur est générée faire à l'intérieur de votre cas de test:
Juste un heads-up,
whatever.merge
est le code qui génère l'erreur (ou n'est pas, selon l'affirmation de type).