ScalaTest AsyncFunSuiteLike множественные утверждения - PullRequest
0 голосов
/ 04 октября 2018

Я переписываю тесты, которые использовались для тестирования актера Акка, который ответил строкой, сейчас мы используем функцию, которая возвращает Future[String].Итак, переписываем тесты с помощью AsyncFunSuiteLike.

В настоящее время я смотрю на тест, который должен утверждать несколько Futures, но я не понимаю, как этого добиться с помощью AsyncFunSuiteLike.

MyТест выглядит следующим образом:

test("Error responses") {

    NanoHTTPD.Response.Status.values().filter(status => status.getRequestStatus >= 400).map {
      status => {
        val statusCode = status.getRequestStatus
        httpService.setStatusCode(status)
        val responseBody = s"Request failed with status $status"
        httpService.setResponseContent(responseBody)
        val errorMessage = s"Error response (${status.getRequestStatus}): $responseBody"

        myobject.request("123456").map {
          resp => assert(resp === "....")
        }
      }
    }

}

Но я получаю сообщение об ошибке type missmatch. Expected: Future[Assertion] actual: List[Future[scalatest.Assertion]]

Любая идея о том, как можно получить несколько утверждений в одном тесте, как этот?

1 Ответ

0 голосов
/ 05 октября 2018

ScalaTest асинхронное тестирование ожидает, что тело теста вернет Future[Assertion].Теперь ваше тестовое тело возвращает List[Future[Assertion]]], потому что

NanoHTTPD.Response.Status.values() ... // Returns List
  ...
    myobject.request("123456").map(resp => assert(resp === "....")} // Returns Future[Assertion]
  ...
}

Мы можем преобразовать List[Future[T]] в Future[List[T]], используя

Future.sequence(listOfFutures)

, и мы можем преобразовать List[Assertion] в Assertionиспользуя

assert(listOfAssertions.forall(_ == Succeeded))

Соединяя это вместе, мы получаем

Future.sequence {
  NanoHTTPD.Response.Status.values().filter(status => status.getRequestStatus >= 400).map {
    status => {
      val statusCode = status.getRequestStatus
      httpService.setStatusCode(status)
      val responseBody = s"Request failed with status $status"
      httpService.setResponseContent(responseBody)
      val errorMessage = s"Error response (${status.getRequestStatus}): $responseBody"

      myobject.request("123456").map {
        resp => assert(resp === "....")
      }
    }
  }
}.map(listOfAssertions => assert(listOfAssertions.forall(_ == Succeeded)))
...