gpt4 book ai didi

testing - 使用 FakeRequests 和分块响应(Enumerator)进行 Play2 测试时是否存在错误?

转载 作者:行者123 更新时间:2023-11-28 20:04:46 26 4
gpt4 key购买 nike

我在使用枚举器测试返回分块响应的 Action 时遇到了 Play 2.3.7 问题:

def text = Action {
Ok.chunked(Enumerator("abc"))
}

使用 curl http://localhost:9000/text 我得到了预期的结果:abc 但是下面的测试:

class ApplicationSpec extends Specification {
"Application" should {
"stream text" in new WithApplication{
val request = route(FakeRequest(GET, "/text")).get
contentAsString(request) mustEqual "abc"
}
}
}

因比较错误而失败:

[info] Application should
[info] x stream text
[error] '3
[error] abc
[error] 0
[error]
[error] ' is not equal to 'abc' (ApplicationSpec.scala:31)

那些额外的字符是从哪里来的?我怀疑这可能是 FakeRequest 和 Enumerators 的问题?在更复杂的情况下,在操作中使用串联的枚举器,枚举器生成的内容之间将混合字符。

最佳答案

这是一个已知问题,已为即将推出的 Play 2.4 修复,但在 2.3.x 中不可用。额外的字符是从分块编码中引入的。它们以十六进制表示位于每个 HTTP 响应正文开头的 block 长度。旧的游戏测试助手只是将它们连接在一起,而不是将它们剔除。

目前我一直在使用以下代码来解决 2.3.x 上的问题(感谢来自 github issue 的 marcuslinke 的帖子):

import scala.concurrent._
import scala.concurrent.duration._
import play.api.mvc._
import play.api.libs.iteratee._
import akka.util.Timeout

def contentAsBytes(of: Future[Result])(implicit timeout: Timeout): Array[Byte] = {
val result = Await.result(of, timeout.duration)
val eBytes = result.header.headers.get(TRANSFER_ENCODING) match {
case Some("chunked") => result.body &> Results.dechunk
case _ => result.body
}
Await.result(eBytes |>>> Iteratee.consume[Array[Byte]](), timeout.duration)
}

我在这样的测试 (specs2) 中使用:

new String(contentAsBytes(result)) must equalTo("expected value")

作为引用,这里是 pull request已合并到 master 中。

关于testing - 使用 FakeRequests 和分块响应(Enumerator)进行 Play2 测试时是否存在错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28461877/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com