【发布时间】:2013-02-14 12:59:17
【问题描述】:
我找到了以下问题/答案:
Test MultipartFormData in Play 2.0 FakeRequest
但在 Play 2.1 中似乎情况发生了变化。我已经尝试像这样调整示例:
"Application" should {
"Upload Photo" in {
running(FakeApplication()) {
val data = new MultipartFormData(Map(), List(
FilePart("qqfile", "message", Some("Content-Type: multipart/form-data"),
TemporaryFile(getClass().getResource("/test/photos/DSC03024.JPG").getFile()))
), List())
val Some(result) = routeAndCall(FakeRequest(POST, "/admin/photo/upload", FakeHeaders(), data))
status(result) must equalTo(CREATED)
headers(result) must contain(LOCATION)
contentType(result) must beSome("application/json")
但是,每当我尝试运行请求时,都会收到空指针异常:
[error] ! Upload Photo
[error] NullPointerException: null (PhotoManagementSpec.scala:25)
[error] test.PhotoManagementSpec$$anonfun$1$$anonfun$apply$3$$anonfun$apply$4.apply(PhotoManagementSpec.scala:28)
[error] test.PhotoManagementSpec$$anonfun$1$$anonfun$apply$3$$anonfun$apply$4.apply(PhotoManagementSpec.scala:25)
[error] play.api.test.Helpers$.running(Helpers.scala:40)
[error] test.PhotoManagementSpec$$anonfun$1$$anonfun$apply$3.apply(PhotoManagementSpec.scala:25)
[error] test.PhotoManagementSpec$$anonfun$1$$anonfun$apply$3.apply(PhotoManagementSpec.scala:25)
如果我尝试仅用路由替换已弃用的 routeAndCall(并删除结果周围的选项),我会收到一个编译错误,指出它无法将 MultipartFormData[TemporaryFile] 的实例写入 HTTP 响应。
在使用 Scala 的 Play 2.1 中设计此测试的正确方法是什么?
编辑:尝试修改代码以仅测试控制器:
"Application" should {
"Upload Photo" in {
val data = new MultipartFormData(Map(), List(
FilePart("qqfile", "message", Some("Content-Type: multipart/form-data"),
TemporaryFile(getClass().getResource("/test/photos/DSC03024.JPG").getFile()))
), List())
val result = controllers.Photo.upload()(FakeRequest(POST, "/admin/photo/upload",FakeHeaders(),data))
status(result) must equalTo(OK)
contentType(result) must beSome("text/html")
charset(result) must beSome("utf-8")
contentAsString(result) must contain("Hello Bob")
}
但是我现在在结果周围的所有测试条件上都出现类型错误,如下所示:
[error] found : play.api.libs.iteratee.Iteratee[Array[Byte],play.api.mvc.Result]
[error] required: play.api.mvc.Result
我不明白为什么要为映射到结果的字节数组获取交互器。这可能与我使用自定义正文解析器的方式有关吗?我的控制器的定义如下所示:
def upload = Action(CustomParsers.multipartFormDataAsBytes) { request =>
request.body.file("qqfile").map { upload =>
使用这篇文章中的表单解析器:Pulling files from MultipartFormData in memory in Play2 / Scala
【问题讨论】:
-
一个类似的问题被问及回答:stackoverflow.com/questions/15013177/…
-
我看到了问题和答案,但它仍然很混乱,没有很好地回答。您指向我已阅读的官方文档,其中不包括多部分表单数据。我实际上也想测试路线,但我想测试控制器就可以了。我仍然不明白如何将文件数据传递给名为“qqfile”的正文。你能用完整的答案编辑你的问题吗?
-
尝试仅测试控制器,但仍然遇到一些问题。上面列出了编辑。
-
我已经删除了该答案的第一部分(这是错误的)。
-
您现在遇到的错误是由您的上传方法方法调用方式引起的。您使用
TemporaryFile调用它,但您指定了multipartFormDataAsBytes正文解析器。您应该使用Array[Byte]而不是TemporaryFile作为数据来调用它。
标签: scala testing playframework-2.0 specs2