2010-11-21 26 views
7

J'utilise ScalaTest pour tester du code Scala. Je actuellement à l'essai des exceptions prévues par le code comme celui-ciComment tester les propriétés supplémentaires des exceptions attendues en utilisant ScalaTest

import org.scalatest._ 
import org.scalatest.matchers.ShouldMatchers 

class ImageComparisonTest extends FeatureSpec with ShouldMatchers{ 

    feature("A test can throw an exception") { 

     scenario("when an exception is throw this is expected"){ 
      evaluating { throw new Exception("message") } should produce [Exception] 
     } 
    } 
} 

Mais je voudrais ajouter contrôle supplémentaire à l'exception, par exemple Je voudrais vérifier que le message d'exceptions contient une certaine chaîne.

Existe-t-il un moyen «propre» de faire cela? Ou dois-je utiliser un bloc try catch?

Répondre

16

J'ai trouvé une solution

val exception = intercept[SomeException]{ ... code that throws SomeException ... } 
// you can add more assertions based on exception here 
9

Vous pouvez faire la même chose avec l'évaluation ... doit produire la syntaxe, parce interception comme, il retourne l'exception pris:

val exception = 
    evaluating { throw new Exception("message") } should produce [Exception] 

Puis inspectez l'exception.

+0

Cela fonctionne et j'aime t sa syntaxe: elle est en ligne avec tous les «devraient être» pour les résultats de la fonction. –

+0

'evaluation 'est déprécié dans 2.x et supprimé dans 3.x. Les docs de dépréciation conseillent d'utiliser 'une [Exception] devrait être thrownBy' à la place. Cependant 3.0.0-M14 renvoie une 'Assertion':' val ex: Assertion = une [Exception] devrait être thrownBy {throw new Exception ("boom")} '. Existe-t-il un moyen de récupérer l'exception 'Exception'? – kostja

2

Si vous avez besoin d'inspecter plus une exception prévue, vous pouvez capturer en utilisant cette syntaxe:

val thrown = the [SomeException] thrownBy { /* Code that throws SomeException */ } 

Cette expression renvoie l'exception prise pour que vous puissiez l'examiner de plus:

thrown.getMessage should equal ("Some message") 

vous pouvez également capturer et inspecter une exception attendue dans une instruction, comme ceci:

the [SomeException] thrownBy { 
    // Code that throws SomeException 
} should have message "Some message"