Другие ответы хорошо объясняют, как этого добиться, используя коллекции 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
и 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)
В приведенных здесь примерах выглядит глупо определять собственные сопоставители, чтобы просто сохранить пару слов в утверждении, но если вы напишите сотни тестов с одинаковыми свойствами, это может быть очень удобнополучить ваши утверждения сводятся к одной строке и все еще будут естественно читаемыми.Таким образом, по моему опыту, определение таких собственных сопоставителей может иметь смысл, если вы повторно используете их во многих тестах.