Frage

Es gibt einige nette Bibliotheken für das Testen in Scala ( Specs , ScalaTest , Scalacheck ). Doch mit Scala leistungsfähigen Typ-System, wichtige Teile einer API in Scala entwickelt statisch ausgedrückt werden, in der Regel in Form von einigen unerwünschten oder unzulässigen Verhalten durch den Compiler verhindert wird.

Also, was ist der beste Weg, zu testen, ob etwas durch den Compiler verhindert wird, wenn eine Bibliothek oder eine andere API entwerfen? Es ist unbefriedigendes Code auszukommen dass sein uncompilable soll und Kommentar- es dann zu überprüfen.

Ein konstruiertes Beispiel Testliste:

val list: List[Int] = List(1, 2, 3)
// should not compile
// list.add("Chicka-Chicka-Boom-Boom")

Ist eine der vorhandenen Test Bibliotheken behandeln Fälle wie diese? Gibt es einen Ansatz, dass die Menschen Gebrauch, das funktioniert?

Der Ansatz wurde ich war angesichts Code in einem Triple-Zitat String oder ein XML-Elemente einbetten und die Compiler in meinem Test nennen. Telefonvorwahl suchen etwas wie folgt aus:

should {
  notCompile(<code>
    val list: List[Int] = List(1, 2, 3)
    list.add("Chicka-Chicka-Boom-Boom")
  </code>)
}

Oder etwas entlang der Linien eines erwarten Skript -Typ auf dem Interpreter genannt.

War es hilfreich?

Lösung

Ich habe einige Spezifikationen erstellt einige Code-Schnipsel ausführt und die Ergebnisse des Interpreters zu überprüfen.

Sie können an der Snippets Charakterzug. Die Idee ist, in einigem org.specs.util.Property [Snippet], um den Code zu speichern, auszuführen:

val it: Property[Snippet] = Property(Snippet(""))
"import scala.collection.List" prelude it // will be prepended to any code in the it snippet
"val list: List[Int] = List(1, 2, 3)" snip it // snip some code (keeping the prelude)
"list.add("Chicka-Chicka-Boom-Boom")" add it  // add some code to the previously snipped code. A new snip would remove the previous code (except the prelude)

 execute(it) must include("error: value add is not a member of List[Int]") // check the interpreter output

Der Hauptnachteil ich mit diesem Ansatz fand, war die Langsamkeit des Dolmetschers. Ich weiß noch nicht, wie diese beschleunigt werden könnte.

Eric.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top