Как использовать "в конце концов" с "Specs2RouteTest"
Здесь есть две спецификации. Первый не проходит, потому что eventually
в check
не приведет к повторному запуску всего маршрута, но я бы предпочел следовать по этому пути. Вторая спецификация - лучшее решение, которое я нашел (и докажу, что оно выполнимо;)), но оно содержит некоторую стандартную функцию, такую как дополнительная функция, которая в реальной жизни должна будет возвращать скорее кортеж, чем одну вещь, и это не согласуется с дизайном синтаксиса тестов спрея проверить маршруты.
Итак, вопрос: как использовать eventually
с аэрозольными тестами, чтобы быть как можно ближе к синтаксису из первой спецификации.
import org.specs2.mutable.Specification
import spray.routing.Directives
import spray.http._
import MediaTypes._
import HttpCharsets._
import spray.testkit.Specs2RouteTest
class EventuallyAndRouts extends Specification with Directives with Specs2RouteTest {
var i = 0
def incAndGet = {
i = i + 1
println(s"This is i = $i")
s"$i"
}
"The testing infrastructure should support an eventually matcher" >> {
"but it is not working inside a check as I need :( (and this will fail)" in {
i = 0
Get() ~> complete(incAndGet) ~> check {
body must eventually(7, 20 millis)(be_===(HttpEntity(ContentType(`text/plain`, `UTF-8`), "5")))
}
}
"so I got workaround :/ (and this is passing)" in {
i = 0
def requestResult = Get() ~> complete(incAndGet) ~> check {
body
}
requestResult must eventually(7, 20 millis)(be_===(HttpEntity(ContentType(`text/plain`, `UTF-8`), "5")))
}
}
}
1 ответ
eventually
используется для повторной оценки значения, которое изменяется. Так что это либо должно быть var
, def
или параметр byname.
Лучший способ обойти это, вероятно, для вас, чтобы реализовать checkEventually(times, delay)
метод, который будет включать в себя eventually
вызов. Что-то вроде того:
implicit class Checked(request: =>Request) {
def checkEventually[R : AsResult](times: Int, delay: Duration, matcher: Matcher[RequestResult])(body: =>Unit)( = {
val requestResult = result ~> check(body)
requestResult must eventually(times, delay)(matcher)
}
}