使用forAll时,将列表元素输出为Scala Specs2中的示例

时间:2014-09-30 18:37:12

标签: scala intellij-idea specs2

在此代码段中,SqlTypes.BinaryTypes(String, Int)元组的列表。

"process binary types" >> {
  SqlTypes.BinaryTypes.foreach(sqlType => {
    val label = sqlType._1
    val value = sqlType._2

    s"$label" in new ABinaryColumnHandler {
      handler.canProcess(value) should beTrue
    }
  })

  "for all of them" in new ABinaryColumnHandler {
    handler should processTypes(SqlTypes.BinaryTypes)
  }
}

foreach所在的第一部分为列表的每个元素创建一个新的示例,并运行简单测试。第二部分调用自定义匹配器:

def processTypes(typeList: List[(String, Int)]): Matcher[ColumnHandler] = (handler: ColumnHandler) => {
    forall(typeList) { sqlType =>
      val value = sqlType._2
      handler.canProcess(value) should beTrue
    }
}

第一部分没有在其后定义的另一个示例的情况下运行,因为foreach的返回是Unit而不是ExampleFragment。我尝试了第二种方式,因为它看起来更简单,但我无法按照我想要的方式构建其输出,就像这样(在IntelliJ中,但在SBT中看起来类似):

output in intellij

我真正想要的是Specs2在两种情况下输出相同,或者更像是

process binary types
   for all of them
      BINARY
      VARBINARY
      LONGBINARY

如何调整后一个示例的运行方式以输出我想要的方式?

1 个答案:

答案 0 :(得分:1)

使用>>并返回Unit的块不明确。您想创建示例还是创建期望?

// is it this?
"several examples" >> {
  Seq(1, 2).foreach { i => s"example $i" >> { 1 must_== 1 } }
}

// or that?
"several expectations" >> {
  Seq(1, 2).foreach { i => i must_== i }
}

为了解决歧义,您需要使用以下两种方法之一:

  • examplesBlock创建示例
  • Result.unit创造期望

像这样:

class TestSpec extends org.specs2.mutable.Specification {

  "process binary types" >> examplesBlock {
     List("BINARY", "VARBINARY").foreach { label =>
      s"$label" in new ABinaryColumnHandler {
        Result.unit(Seq(1, 2).foreach(i => i must_== i))
      }
    }
  }

  trait ABinaryColumnHandler extends Scope
}

User Guide中有关于这两种方法的说明。