2010-11-21 8 views
7

Ich verwende ScalaTest zum Testen einiger Scala-Code. ich testen derzeit für erwartete Ausnahmen mit Code wie diesemSo testen Sie zusätzliche Eigenschaften der erwarteten Ausnahmen mit 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] 
     } 
    } 
} 

Aber ich möchte auf die Ausnahme zusätzliche Überprüfung hinzufügen, z.B. Ich möchte überprüfen, dass die Ausnahmemeldung einen bestimmten String enthält.

Gibt es einen "sauberen" Weg, dies zu tun? Oder muss ich einen try catch-Block verwenden?

Antwort

16

fand ich eine Lösung

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

Sie können mit der Auswertung der gleiche Art der Sache zu tun ... sollte Syntax produzieren, denn wie abfangen, es die abgefangene Ausnahme gibt:

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

Dann prüfen Sie die Ausnahme.

+0

Es funktioniert und ich mag t seine Syntax: Es ist in Übereinstimmung mit allen "sollte sein" für Funktionsergebnisse. –

+0

"evaluating" ist in 2.x veraltet und in 3.x entfernt. Deprecation-Dokumente empfehlen die Verwendung von 'a [Exception] sollte stattdessen" throntBy "sein. 3.0.0-M14 gibt jedoch eine 'Assertion' zurück:' val ex: Assertion = an [Exception] sollte geworfen werdenBy {neue Exception ("boom")} '. Gibt es eine Möglichkeit, die "Exception" zurück zu bekommen? – kostja

2

Wenn Sie eine erwartete Ausnahme weiter untersuchen müssen, können Sie es erfassen diese Syntax:

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

Dieser Ausdruck gibt die abgefangene Ausnahme, so dass Sie es weiter untersuchen können:

thrown.getMessage should equal ("Some message") 

Sie können auch eine erwartete Ausnahme in einer Anweisung erfassen und untersuchen:

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