2017-03-08 5 views
0

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?

Antwort

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

Sie können auch verwenden Scalacheck

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

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

+1

Noch möglich: 'prop ((s: String) => echo (s muss beEqualTo (s) sein). SetGen (Gen.oneOf (strings: _ *)) ' – Eric

+0

Nochmals vielen Dank. Ist es wirklich besser als nur 'strings foreach {s => echo (s) mussEqualTo (s)} sein, wie oben vorgeschlagen? – Michael

Verwandte Themen