PlayFramework测试:在伪造请求错误中上传文件

Oph*_*lia 4 testing scala playframework

我想测试我的方法,这需要上传文件.它初始化如下:

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())
Run Code Online (Sandbox Code Playgroud)

我将它传递给FakeRequest:

val result = route(
  FakeRequest(POST, "/api/courses/"+"4f3c4ec9-46bf-4a05-a0b2-886c2040f2f6"+"/import" )
    .withHeaders("Authorization" -> ("Session " + testSessionA.id.string))
    .withMultipartFormDataBody(formData)
)
Run Code Online (Sandbox Code Playgroud)

但是当我运行测试时,我收到以下错误:

Cannot write an instance of play.api.mvc.AnyContentAsMultipartFormData to HTTP response. Try to define a Writeable[play.api.mvc.AnyContentAsMultipartFormData]
Run Code Online (Sandbox Code Playgroud)

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

Zei*_*yth 5

重要的是要记住http请求完全是文本.route()采用隐式Writeable方法将提供的请求的主体类型转换为文本.没有权利Writeable,就无法知道如何MultipartFormData变成请求体.

似乎没有成为一个为可写MultipartFormData,但你可以提供你自己的.jroper有一个很好的可写,你可以用来参考.(编辑:那个代码有问题,这里有一个可编写的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]]])
Run Code Online (Sandbox Code Playgroud)

或者做Writeable一个Writeable[AnyContentAsMultipartFormData].