2010-08-11 28 views
37

Je veux tester une fonction sur un de mes modèles qui génère des erreurs spécifiques. La fonction ressemble à ceci:Rails ActiveSupport: Comment affirmer qu'une erreur est survenue?

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 fait que les exceptions sont jetés en fait chacun de ces exceptions. Je regardais la documentation d'ActiveSupport, mais je ne trouvais rien de prometteur. Des idées?

Répondre

85

Les tests unitaires ne sont donc pas vraiment actifsupport. Ruby est livré avec un framework xunit typique dans les libs standard (Test :: Unit dans ruby ​​1.8.x, MiniTest dans ruby ​​1.9), et les trucs dans activesupport viennent y ajouter quelques trucs.

Si vous utilisez Test :: Unit/MiniTest

assert_raises(Exception) { whatever.merge } 

si vous utilisez rspec (malheureusement mal documenté, mais beaucoup plus populaire)

lambda { whatever.merge }.should raise_error 

Si vous voulez vérifier le relief Exception:

exception = assert_raises(Exception) { whatever.merge } 
assert_equal("message", exception.message) 
+7

Merci! J'ai dû utiliser "RuntimeError" au lieu de l'exception cependant, comme ceci: assert_raise (RuntimeError) {artist1.merge (artist1)} Ce guide a été extrêmement utile: http://guides.rubyonrails.org/testing.html – spilliton

+1

@spilliton: C'est parce que l'interpréteur Ruby traite le code ci-dessus comme 'assert_raise (Exception() {whatever.merge})', c'est-à-dire qu'il recherche une méthode appelée 'Exception' qui est appelée avec le bloc donné. L'ajout des parenthèses résout cette ambiguïté. (Déjà corrigé la réponse) –

+0

Dans rspec 3, utilisez 'expect {whatever.merge} .to raise_error' (http://www.relishapp.com/rspec/rspec-expectations/v/3-1/docs/built- in-matchers/raise-error-matcher) –

9

Pour assurer qu'aucune exception est soulevée (ou est traitée avec succès) faire dans votre cas de test:

assert_nothing_raised RuntimeError do 
     whatever.merge 
    end 

Pour vérifier cette erreur est relevée faire dans votre cas de test:

assert_raise RuntimeError do 
     whatever.merge 
    end 

Ouais .. son aussi simple que cela! :)