我正在重写用于测试以String响应的Akka演员的测试,现在,我们使用的函数返回a Future[String]。因此,请使用AsyncFunSuiteLike重写测试。
目前,我正在测试一个必须断言多个Future的测试,但是我似乎不太了解如何使用AsyncFunSuiteLike实现它。
我的测试如下所示:
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 === "....")
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是我遇到一个错误 type missmatch. Expected: Future[Assertion] actual: List[Future[scalatest.Assertion]]
关于如何在单个测试中实现多个断言的想法?
ScalaTest 异步测试期望测试主体返回Future[Assertion]。现在您的测试体返回,List[Future[Assertion]]]因为
NanoHTTPD.Response.Status.values() ... // Returns List
...
myobject.request("123456").map(resp => assert(resp === "....")} // Returns Future[Assertion]
...
}
Run Code Online (Sandbox Code Playgroud)
我们可以转换List[Future[T]]到Future[List[T]]使用
Future.sequence(listOfFutures)
Run Code Online (Sandbox Code Playgroud)
并且,我们可以转换List[Assertion]到Assertion使用
assert(listOfAssertions.forall(_ == Succeeded))
Run Code Online (Sandbox Code Playgroud)
放在一起我们得到
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)))
Run Code Online (Sandbox Code Playgroud)