【问题标题】:ScalaTest AsyncFunSuiteLike multiple assertsScalaTest AsyncFunSuiteLike 多个断言
【发布时间】:2019-03-10 08:06:44
【问题描述】:

我正在重写用于测试以字符串响应的 Akka 演员的测试,现在,我们使用一个返回 Future[String] 的函数。所以使用 AsyncFunSuiteLike 重写测试。

目前我正在研究一个必须断言多个 Futures 的测试,但我似乎不明白如何使用 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 === "....")
        }
      }
    }

}

但我收到一个错误type missmatch. Expected: Future[Assertion] actual: List[Future[scalatest.Assertion]]

关于如何在这样的单个测试中实现多个断言的任何想法?

【问题讨论】:

    标签: scala future scalatest


    【解决方案1】:

    ScalaTest asynchronous testing 期望测试主体返回 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)))
    

    【讨论】:

    • 谢谢马里奥。我面临一个问题。断言时,在 val 上设置的 errorMessages 与相应的错误消息不匹配。我猜这是由于测试的异步。我总是在响应中得到最后一个错误消息,因为当异步测试运行时,NanoHTTPD 总是设置为最后一个设置的值。有没有办法解决这个问题? (不使用等待)
    猜你喜欢
    • 2019-03-11
    • 1970-01-01
    • 2016-05-14
    • 2014-11-16
    • 1970-01-01
    • 2014-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多