2016-10-03 5 views
2

Ich habe einen org.scalatest.FunSpec with org.scalatest.Matchers Test, der das folgende tut, z.B.Scalatest: sollte Matchers mit extra Beschreibung sein?

val tol = 1e-10 
val res = 1.000000000000001 
val ref = 1.000000000000000 
res should be (ref +- tol) 

aber es tut dies in einer Schleife für mehrere Fälle mit Namen eingegeben hat, kann ich natürlich nicht die Granularität des getesteten Code ändern, so erhalte ich eine Sammlung von Werten mit diesen Namen zu ihnen verbunden ist. Daher muss für einen obigen Test ein zusätzlicher Kontext oder eine zusätzliche Beschreibung name angegeben werden, um zu reflektieren, auf welchen Namen es zutrifft. Ich brauche so etwas wie:

val name : String = ... 
res should be (ref +- tol) for name 

ich nicht it und describe an dieser Stelle verwenden können, weil sie bereits draußen sind.

Antwort

3

Es hängt wirklich davon ab, was Sie zu tun versuchen, und Sie sollten wahrscheinlich ein vollständigeres Beispiel hinzufügen was Sie erreichen möchten, aber Sie könnten describe in der Schleife verwenden. Zum Beispiel:

class TempTest extends FunSpec with Matchers { 

    describe("Some example test") { 

    (1 to 10).foreach { i => // your loop here 

     describe(s"Scenario $i") { 
     it("should be equal to itself") { 
      i shouldBe i 
     } 
     } 
    } 
    } 
} 

UPDATE: Sie könnten withClue verwenden, um mehr Kontext zu dem Matcher hinzufügen z.B .:

withClue("Some clarifying message") { 
    i shouldBe 5 
} 

Dies wird den Hinweis Zeichenfolge auf den Fehler hinzufügen, wenn die Bedingungen nicht.

+0

Gut, aber ich kann das nicht tun ... wir haben eine skalierbare Erweiterung, die Tests sendet, die remote in einem Cluster ... diesem Framework berechnet werden nimmt schon den äußersten 'describe' auf und wickelt jeden Test automatisch in ein' it', das es so beschreibt ... Ich brauche eine Möglichkeit, den Text 'name' an die' res anzuhängen (ref + - tol) ' Bedingung ... vielleicht ist der einzige Weg, die potenzielle "TestFailedException" zu fangen und zu bereichern ... und natürlich zu 'assertResult' zu wechseln ist eine andere Möglichkeit, einfach den Should Matcher –

+0

@GiovanniAzua aufzugeben, würde das Beispiel im Update Ihnen helfen? –

+0

Das war's, du hast es geschafft :) Ich bin wirklich froh, dass scalatest so gestaltet ist, dass fast kein realistisches Szenario mehr offen steht: D –

1

Wahrscheinlich GivenWhenThen kann verwendet werden, um Kontext zu den Tests Bericht hinzufügen. Ich bin nicht sicher, wie genau Sie mehrere Tests in der Schleife wickeln, aber hier ist die Idee:

import org.scalatest.{GivenWhenThen, WordSpec} 

/** 
    * Created by alex on 10/3/16. 
    */ 
class Temp extends WordSpec with GivenWhenThen{ 
    val names = List("Alex", "Dana") 
    for(name <- names)yield{ 
    "Reversing a name " + name + " two times" should { 
     "result in the same name" in{ 
     Given("name " + name) 
     When("reversed two times") 
     val reversed = name.reverse.reverse 
     Then("it should be the same") 
     assert(name === reversed) 
     } 
    } 
    } 
} 
+0

Dies ist ein guter Zeiger jedoch, dann muss ich den besten Kontextfehler aufgeben, der durch 'res erzeugt wird, soll (ref + - tol)' und stattdessen Assert verwenden. Ich kann auch direkt auf Asser wechseln, ohne 'GivenWhenThen' –

+0

stimme zu, alle gültigen Punkte –