2017-01-27 2 views
2

Ich kann nicht scheinen Specs2 benutzerdefinierte Nachrichten zu drucken.Wie kann ich benutzerdefinierte Nachrichten mit veränderbaren Specs2-Spezifikationen verwenden?

import org.junit.runner.RunWith 
import org.specs2.mutable.Specification 
import org.specs2.runner.JUnitRunner 

@RunWith(classOf[JUnitRunner]) 
class MessageSpecs extends Specification { 
    "This" should { 
    "fail" in { 
     true.must(beFalse).setMessage("this should PRINT") 
     //true.must(beFalse.setMessage("this should PRINT")) // or maybe this? no. 
     //true.must(beFalse).updateMessage(_ => "this should PRINT") // not this either 
    } 
    } 
} 

Ich bekomme einfach die Standard Fehlermeldung "der Wert ist wahr". Dies ist auf specs2 3.8.5 mit dem JUnitRunner über Maven. Ich habe das bei einem sbt-Projekt noch nicht ausprobiert. Die Dokumentation, die ich finden kann, deutet darauf hin, dass dies funktionieren sollte.

--- --- Bearbeiten

Art-of Work-around: true.aka("this should PRINT").must(beFalse) // works

, die ein bisschen hässlich druckt, wenn in der Praxis verwendet, um einen komplizierten Ausfall zu beschreiben, aber zumindest druckt es, so Ich kann den zusätzlichen Kontext hinzufügen, der notwendig ist, um den Fehler leichter zu verstehen.

Antwort

3

Das Hauptproblem hier kommt von der Tatsache, dass Sie eine veränderbare Spezifikation verwenden. In einer veränderbaren Spezifikation werden Ausnahmen ausgelöst, wenn ein Ergebnis falsch ist. In diesem Fall, bevor Sie versuchen können, eine andere Nachricht zu erstellen, schlägt der Test fehl (mit der ursprünglichen Nachricht).

Sie haben 2 Möglichkeiten:

  • stellen Sie die Meldung auf dem Matcher selbst

    false must beTrue.setMessage("ko") 
    
  • Capture das Ergebnis mit org.specs2.execute.AsResult (dies fängt Ausnahmen)

    AsResult(false must beTrue).updateMessage("ko") 
    

Sie werden auch feststellen, dass sich die API zum Setzen/Aktualisieren von Nachrichten leicht unterscheidet, je nachdem, ob Sie eine Nachricht auf MatchResult (für die es eine übereinstimmende Entität gibt) und Result (was ein allgemeinerer Begriff ist) festlegen. Ersteres verwendet setMessage, letzteres verwendet updateMessage.

Und für das Protokoll, gibt es andere Möglichkeiten, um mehr Informationen zu einem bestimmten Ausfall hinzufügen:

  • Verwendung aka den tatsächlichen Wert zu beschreiben, wie Sie

    bemerken
  • einen Satz verwenden, um zu beschreiben die volle Erwartung

    "Values are correct" ==> { 
        values must beCorrect 
    } 
    
  • einen neuen Matcher erstellen

    def myMatcher: Matcher[Int] = (i: Int) => 
        (test(i), s"what's wrong with $i") 
    
+0

Dank @Eric. Ich bin mir ziemlich sicher, dass ich dies mit einigen komplizierteren Matches als BeFalse gesehen habe, was mich dazu gebracht hat, es auf das oben genannte zu reduzieren. Wenn ich sie wieder sehe, werde ich hier eine Notiz schreiben. Seitdem habe ich die Spezifikation jedoch neu organisiert und verwende 'aka', da es zuverlässiger erscheint. –

+0

Scott, ich habe die Antwort aktualisiert. – Eric

Verwandte Themen