Supposons que je tester une fonction echo: String => String
, qui est juste répéter l'entrée, avec specs2
.tests unitaires simple avec monoids
Je peux écrire quelques tests comme ça:
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("אבג")
}
}
Cependant, je préférerais se débarrasser du code de passe-partout. Donc, je me sers cats
monoids:
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
}
Est-il judicieux? Comment l'améliorer/le simplifier? Le monoï est-il vraiment nécessaire ici? Puis-je me débarrasser du code standard du ci-dessus sans monoid?
Merci! Bon à savoir que 'ScalaCheck' peut être intégré avec' specs2'. Je voudrais tester 'echo' une liste donnée constante de chaînes si – Michael
encore possible:' prop ((s: String) => écho (s) doit beEqualTo (s)) (setGen Gen.oneOf (cordes: _. *)) ' – Eric
Merci encore. Est-ce vraiment mieux que de simplement dire que 'strings foreach {s => echo (s) doit êtreEqualTo (s)}' comme suggéré ci-dessus? – Michael