在此代码段中,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
而不是Example
或Fragment
。我尝试了第二种方式,因为它看起来更简单,但我无法按照我想要的方式构建其输出,就像这样(在IntelliJ中,但在SBT中看起来类似):
我真正想要的是Specs2在两种情况下输出相同,或者更像是
process binary types
for all of them
BINARY
VARBINARY
LONGBINARY
如何调整后一个示例的运行方式以输出我想要的方式?
答案 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中有关于这两种方法的说明。