Есть ли способ составить генераторы в scala test/scala check?
Например, вот пример тестового случая, который я хотел бы написать:
"The classifier" when {
"given a string containing a state" should {
"classify it as a state" in {
val states = Seq(
"Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", "Connecticut", "Delaware",
"Florida", "Georgia", "Hawaii", "Idaho", "Illinois", "Indiana", "Iowa", "Kansas", "Kentucky",
"Louisiana", "Maine", "Maryland", "Massachusetts", "Michigan", "Minnesota", "Mississippi",
"Missouri", "Montana", "Nebraska", "Nevada", "New Hampshire", "New Jersey", "New Mexico",
"New York", "North Carolina", "North Dakota", "Ohio", "Oklahoma", "Oregon", "Pennsylvania",
"Rhode Island", "South Carolina", "South Dakota", "Tennessee", "Texas", "Utah", "Vermont",
"Virginia", "Washington", "West Virginia", "Wisconsin", "Wyoming"
)
val inputData = for {
zip <- Gen.const("10001")
name <- Gen.oneOf(
Gen.oneOf(states) + "HARRINGTON, JOHN",
"HARRINGTON, JOHN " + Gen.oneOf(states),
"HARRINGTON, " + Gen.oneOf(states) + " MD,JOHN"
)
} yield (zip, name)
forAll (inputData) { case (zip: String, name: String) =>
Clasifier.classify(zip, name) shouldBe Classification.STATE
}
}
}
}
Обратите внимание на генератор name
для понимания, чтобы получить inputData
val
.
Как я могу добиться чего-то подобного?
Обновление: я заставил это работать, но не уверен, что поступаю правильно.
val inputData = for {
zip <- Gen.const("10001")
name <- Gen.oneOf(
s"${Gen.oneOf(states).sample.get} HARRINGTON, JOHN",
s"HARRINGTON, JOHN ${Gen.oneOf(states).sample.get}",
s"HARRINGTON, ${Gen.oneOf(states).sample.get} MD,JOHN"
)
} yield (zip, name)
Сообщение об ошибке (ожидаемый сбой) не очень помогает в том, что я делаю:
TestFailedException was thrown during property evaluation.
Message: STATE was not equal to INDIVIDUAL
Location: (Classifier$Test.scala:142)
Occurred when passed generated values (
arg0 = (,) // 12 shrinks
)
PS: Как и просили в комментарии, вот как я ожидаю, что входные данные будут выглядеть так:
"Alabama Harringgon, John",
"Harriongton, Alabama John",
"Harrington, John Alabama",
"Maryland Harrington, John",
"Harrington, Maryland John",
"Harrington, John Maryland",
etc.
inputData
? Просто чтобы знать, имеет ли смысл ваша реализация с учетом ваших требований. - person pedromss   schedule 01.09.2017