Angenommen, ich teste eine Funktion echo: String => String
, die nur die Eingabe wiederholt, mit specs2
.Einfache Unit-Tests mit Monoiden
Ich kann ein paar Tests wie das schreiben:
class EchoSpec extends SpecificationWithJUnit {
"echo should handle ASCII alphanumeric names" in {
echo("abc") must beEqualTo("abc")
}
"echo should handle names with slashes" in {
echo("a/b/c") must beEqualTo("a/b/c")
}
"echo should handle names with dots" in {
echo("a.b.c") must beEqualTo("a.b.c")
}
"echo should handle non-ASCII names" in {
echo("אבג") must beEqualTo("אבג")
}
}
Jedoch habe ich der Standardcode bekommen würde es vorziehen, zu befreien. Also ich bin mit cats
Monoide:
import cats.implicits._
def testEcho(expected: String): String => Option[String] = {str =>
if (str == expected) none else s"$str != expected".some
}
def testEchoes(expected: List[String]): Option[String] =
expected foldMap testEcho map (_.mkString(", "))
"echo should handle all names" {
val expected = List("abc", "a/b/c", "a.b.c", "אבג")
testEcho(expected) must beNone
}
Ist es sinnvoll? Wie kann ich es verbessern/vereinfachen? Ist das Monoid hier wirklich notwendig? Kann ich den Boilerplate-Code von oben ohne Monoid loswerden?
Dank! Gut zu wissen, dass 'ScalaCheck' in' specs2' integriert werden kann. Ich würde gerne "echo" mit einer konstanten gegebenen Liste von Strings testen, obwohl – Michael
Noch möglich: 'prop ((s: String) => echo (s muss beEqualTo (s) sein). SetGen (Gen.oneOf (strings: _ *)) ' – Eric
Nochmals vielen Dank. Ist es wirklich besser als nur 'strings foreach {s => echo (s) mussEqualTo (s)} sein, wie oben vorgeschlagen? – Michael