2017-03-08 13 views
0

入力を繰り返す関数echo: String => Stringspecs2でテストしたとします。単体での単体テスト試験

私はそのようないくつかのテストを書くことができます:

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("אבג") 
    } 
} 

私は定型的なコードを取り除くことを好むだろうが。だから私はcatsモノイド使用しています:

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 
} 

をそれは意味を成していますか?どのように改善する/それを簡素化する? ここにモノイドが本当に必要ですか?上記のの定型コードを monoidなしで削除することはできますか?

答えて

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

またScalaCheck

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

感謝を使用することができます! 'ScalaCheck'が' specs2'と統合できることを知っておきましょう。 – Michael

+1

でも可能ですが、私は '' echo ''' '' '' '' '' '' '' '' '' '' '' ''を使って '' echo''をテストしたいと思います。 *)) ' – Eric

+0

もう一度ありがとうございます。上記のように 'string = foreach {s => echo(s)must beEqualTo(s)} 'よりも本当に良いですか? – Michael