Как использовать "в конце концов" с "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)
  }
}
Другие вопросы по тегам