gpt4 book ai didi

scala - 在 FakeRequest 中使用 MultipartFormData 进行框架测试

转载 作者:行者123 更新时间:2023-11-28 19:41:47 25 4
gpt4 key购买 nike

我目前正在为 Play Framework 2.2.x 应用程序编写一些 Specs2 测试,该应用程序接受 MultipartFormData 提交作为其功能的一部分。

我已经使用以下形式成功地编写了带有文本和 JSON 正文的其他测试:

"respond to POST JSON with description field present" in {
running(FakeApplication()) {
val response = route(FakeRequest(POST, "/submission.json").withJsonBody(toJson(Map("content" -> toJson("test-content"), "description" -> toJson("test-description"))))).get
status(response) must equalTo(OK)
contentType(response) must beSome.which(_ == "application/json")
contentAsString(response) must contain(""""description":"test-description"""")
contentAsString(response) must contain(""""content":"test-content"""")
}
}

但是,当我使用 .withMultipartFormData 方法时,出现以下错误:

Cannot write an instance of play.api.mvc.AnyContentAsMultipartFormData to HTTP response. Try to define a Writeable[play.api.mvc.AnyContentAsMultipartFormData]
val response = route(FakeRequest(PUT,"/submission.json/1/files").withMultipartFormDataBody(data)).get
^

我一直试图调试的 MultipartFormData 测试的形式是:

"respond to file PUT form with details not specififed" in {
running(FakeApplication()) {
val basePath:String = Play.application.path.getCanonicalPath();
val data:MultipartFormData[TemporaryFile] = MultipartFormData(Map[String,Seq[String]](),
List(
FilePart("file_upload","",Some("Content-Type: multipart/form-data"),TemporaryFile(new java.io.File(basePath + "/test-data/testUpload.jpg")))
),
List(),
List())


val response = route(FakeRequest(PUT,"/submission.json/1/files").withMultipartFormDataBody(data)).get
status(response) must equalTo(CREATED)
}
}

查看 FakeRequest 类相关版本的 Play Framework 文档,我看不出有太多帮助我追查问题的地方:play.api.test.FakeRequest

就此事的其他文档而言,Play Framework 网站和 Google 似乎相当缺乏。

我尝试了以下替代方法来尝试测试我的 MultipartFormData 代码:

但是,我也没有使用这些方法取得任何成功。

最佳答案

我一直在单元测试,而不是在缓慢且(根据我的经验)测试并行运行时容易出错的 FakeApplication 中进行测试我的多部分表单上传处理程序是这样的:

  1. 从 Controller 中的实际上传处理中分离出 Play 接线;例如:

    def handleUpload = Action(parse.multipartFormData) { implicit request =>
    doUpload(request)
    }

    def doUpload(request:Request[MultipartFormData[TemporaryFile]]) = {
    ...
    }

    (其中 handleUpload 是您的 routes 文件中处理 POST 的方法)

  2. 现在您已经有了一个更容易获得的端点,您可以模拟您的服务层以适本地响应好的/坏的请求,并将模拟服务注入(inject)您的 Controller 正在测试中(我不会在这里展示,有一百万种不同的方法可以做到这一点)

  3. 现在模拟一个多部分请求,它将到达您的doUpload 方法:

    val request= mock[Request[MultipartFormData[TemporaryFile]]]
    val tempFile = TemporaryFile("do_upload","spec")
    val fileName = "testFile.txt"
    val part = FilePart("key: String", fileName, None, tempFile)
    val files = Seq[FilePart[TemporaryFile]](part)
    val multipartBody = MultipartFormData(Map[String, Seq[String]](), files, Seq[BadPart](), Seq[MissingFilePart]())
    request.body returns multipartBody
  4. 最后,您可以调用您的 doUpload 方法并验证功能:

    val result = controller.doUpload(request)
    status(result) must beEqualTo(201)

通过这样的测试,您可以快速轻松地测试 Controller 中的所有错误处理路径(毕竟这可能是您正在尝试做的),而无需额外开销启动整个应用程序。

关于scala - 在 FakeRequest 中使用 MultipartFormData 进行框架测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19658766/

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