web-dev-qa-db-fra.com

Rails ActiveSupport: Comment affirmer qu'une erreur est déclenchée?

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?

51
spilliton

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 )
100
Matt Briggs

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).

15
shivam