2017-03-08 7 views
0

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?

Répondre

1
List("abc", "a/b/c", "a.b.c", "אבג") 
    .foreach(s => echo(s) must beEqualTo(s)) 
1

Vous pouvez également utiliser ScalaCheck

class EchoSpec extends SpecificationWithJUnit with ScalaCheck { 
    "echo should handle all names" >> prop { s: String => 
    echo(s) must beEqualTo(s) 
    } 
} 
+0

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

+1

encore possible:' prop ((s: String) => écho (s) doit beEqualTo (s)) (setGen Gen.oneOf (cordes: _. *)) ' – Eric

+0

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