我想测试我的方法,这需要上传文件。它是这样初始化的:

val tempFile = TemporaryFile(new java.io.File("/home/ophelia/Desktop/students"))
val part = FilePart[TemporaryFile](
  key = "students",
  filename = "students",
  contentType = Some("text/plain"),
  ref = tempFile)
val files = Seq[FilePart[TemporaryFile]](part)
val formData = MultipartFormData(
  dataParts = Map(),
  files = Seq(part),
  badParts = Seq(),
  missingFileParts = Seq())

我将它传递给 FakeRequest:
val result = route(
  FakeRequest(POST, "/api/courses/"+"4f3c4ec9-46bf-4a05-a0b2-886c2040f2f6"+"/import" )
    .withHeaders("Authorization" -> ("Session " + testSessionA.id.string))
    .withMultipartFormDataBody(formData)
)

但是当我运行测试时,我收到以下错误:
Cannot write an instance of play.api.mvc.AnyContentAsMultipartFormData to HTTP response. Try to define a Writeable[play.api.mvc.AnyContentAsMultipartFormData]

我做错了什么以及如何解决?我在互联网上查看,我没有找到任何有用的方法来理解和解决这个问题。

最佳答案

重要的是要记住 http 请求完全是文本。 route() 采用隐式 Writeable 将提供的请求的正文类型转换为文本。如果没有正确的 Writeable ,就无法知道如何将 MultipartFormData 转换为请求正文。

似乎没有 Writeable for MultipartFormData ,但您可以提供自己的。 jroper 有一个 great Writeable 可供引用。 (编辑:该代码有问题,这里是 a working Writeable for AnyContentAsMultipartFormData )

获得 Writeable 后,您将需要使其可用于您对 route() 的调用。请记住,您目前拥有的是 FakeRequest[AnyContentAsMultipartFormData] ,而不是 FakeRequest[MultipartFormData] 。您可以先转换您的请求:

val request = FakeRequest(POST,
    "/api/courses/"+"4f3c4ec9-46bf-4a05-a0b2-886c2040f2f6"+"/import" )
        .withHeaders("Authorization" -> ("Session "))
        .withMultipartFormDataBody(formData)
route(request.map(_.mdf).asInstanceOf[FakeRequest[MultipartFormData[TemporaryFile]]])

或者让你的 Writeable 成为 Writeable[AnyContentAsMultipartFormData]

10-08 11:28