其他答案很好地解释了如何使用 Scala 集合来实现这一点。因为看起来您正在使用 ScalaTest,所以我想补充一点,您也可以使用 ScalaTest 循环遍历元素。
使用检查器的循环样式语法:
forAtLeast(1, reasons.items) { item =>
item.status must be ("ACTIVE")
}
forAtLeast(1, reasons.items) { item =>
item.status must be ("INACTIVE")
}
请注意,检查器与匹配器是分开定义的,因此您必须import org.scalatest.Inspectors._
或extends … with org.scalatest.Inspectors
进入forAtLeast
范围。
如果您想避免检查器的循环样式语法,可以将检查器简写语法与基于反射的语法一起使用have
:
atLeast(1, reasons.items) must have ('status "ACTIVE")
atLeast(1, reasons.items) must have ('status "INACTIVE")
如果您想避免基于反射的语法have
,您可以扩展have
语法以直接支持您的status
属性:
def status(expectedValue: String) =
new HavePropertyMatcher[Item, String] {
def apply(item: Item) =
HavePropertyMatchResult(
item.status == expectedValue,
"status",
expectedValue,
item.title
)
}
atLeast(1, reasons.items) must have (status "ACTIVE")
atLeast(1, reasons.items) must have (status "INACTIVE")
或者,如果您更喜欢be
,则have
可以扩展be
语法以添加对active
and的支持inactive
:
class StatusMatcher(expectedValue: String) extends BeMatcher[Item] {
def apply(left: Item) =
MatchResult(
left.status == expectedValue,
left.toString + " did not have status " + expectedValue,
left.toString + " had status " + expectedValue,
)
}
val active = new StatusMatcher("ACTIVE")
val inactive = new statusMatcher("INACTIVE")
atLeast(1, reasons.items) must be (active)
atLeast(1, reasons.items) must be (inactive)
在此处的示例中,定义自己的匹配器只是为了在断言中保存几个单词看起来有点傻,但是如果您编写数百个关于相同属性的测试,将断言简化为一行会非常方便并且仍然是自然可读的。所以根据我的经验,如果你在很多测试中重用它们,像这样定义你自己的匹配器是有意义的。