在FakeRequest中使用MultipartFormData进行播放框架测试 [英] Play Framework Testing using MultipartFormData in a FakeRequest

查看:150
本文介绍了在FakeRequest中使用MultipartFormData进行播放框架测试的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am currently in the process of writing some Specs2 tests for may Play Framework 2.2.x application which accepts MultipartFormData submissions as part of it's function.

我已经使用以下格式成功编写了其他包含文本和JSON主体的测试:

I have successfully written other tests with text and JSON bodies using the following form:

"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方法时,出现以下错误:

However, when I use the .withMultipartFormData method I get the following errors:

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测试的形式为:

The MultipartFormData test I have been attempting to debug is of the form:

"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)
 }
}

我在Play框架文档中找到了有关FakeRequest类的相关版本,但看不到太多帮助我找到问题所在:

Looking at the Play Framework documentation for the relevant version of the FakeRequest class I can't see too much to help me trace down the problem: play.api.test.FakeRequest

就此问题的其他文档而言,似乎缺少Play Framework网站和Google.

And in terms of other documentation on the matter it seems the Play Framework website and Google are rather lacking.

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

I have tried the following alternative means of attempting to test my MultipartFormData code:

  • Writing a test case for file uploads in Play 2.1 and Scala
  • Test MultipartFormData in Play 2.0 FakeRequest
  • How do I test multipart form data requests for file uploads in Play Framework 2.0 using Java? (Translating to Scala code first).

但是,我在这些方法中都没有取得任何成功.

However, I have not had any success with any of these approaches either.

推荐答案

不是在FakeApplication中进行测试,因为它运行缓慢,并且(以我的经验)在并行运行测试时容易出错(我很经验), 单元测试这样的我的Multipart表单上传处理程序:

Rather than testing in a FakeApplication which is slow and (in my experience) can be error-prone when tests are running in parallel, I've been unit testing my Multipart form upload handlers like this:

  1. 从控制器中的实际上传处理中断开Play连线;例如:

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

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

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

(Where handleUpload is the method in your routes file that handles the POST)

现在您有了一个更容易到达的端点,您可以模拟您的服务层,以适当地响应好/坏请求,并将模拟服务注入到控制器中在测试中(我不会在这里显示,有百万种不同的方法可以做到这一点)

Now you've got an endpoint that's easier to get at, you can mock out your service layer to respond appropriately to good/bad requests, and inject the mock service into your controller under test (I won't show that here, there are a million different ways to do that)

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

Now mock out a multipart request that will arrive at your doUpload method:

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 

  • 最后,您可以调用doUpload方法并验证功能:

  • And finally, you can call your doUpload method and verify functionality:

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

  • 通过这样的测试,您可以快速轻松地测试Controller中的所有错误处理路径(毕竟这可能是您要尝试执行的操作),而无需启动整个应用程序.

    By testing like this, you can quickly and easily test all the error-handling paths in your Controller (which is probably what you're trying to do after all) without the overhead of needing to start the entire application.

    这篇关于在FakeRequest中使用MultipartFormData进行播放框架测试的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆