Schreiben eines Testfalls für das Hochladen von Dateien in Play 2.1 und Scala
Ich habe folgende Frage / Antwort gefunden:
Testen Sie MultipartFormData in Play 2.0 FakeRequest
Anscheinend hat sich in Play 2.1 etwas geändert. Ich habe versucht, das Beispiel so anzupassen:
"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")
Bei jedem Versuch, die Anforderung auszuführen, wird jedoch eine Nullzeiger-Ausnahme angezeigt:
[error] ! Upload Photo
[error] NullPointerException: null (PhotoManagementSpec.scala:25)
[error] test.PhotoManagementSpec$anonfunTesten Sie MultipartFormData in Play 2.0 FakeRequest$anonfun$applyBei jedem Versuch, die Anforderung auszuführen, wird jedoch eine Nullzeiger-Ausnahme angezeigt:$anonfun$apply$4.apply(PhotoManagementSpec.scala:28)
[error] test.PhotoManagementSpec$anonfunTesten Sie MultipartFormData in Play 2.0 FakeRequest$anonfun$applyBei jedem Versuch, die Anforderung auszuführen, wird jedoch eine Nullzeiger-Ausnahme angezeigt:$anonfun$apply$4.apply(PhotoManagementSpec.scala:25)
[error] play.api.test.Helpers$.running(Helpers.scala:40)
[error] test.PhotoManagementSpec$anonfunTesten Sie MultipartFormData in Play 2.0 FakeRequest$anonfun$apply$3.apply(PhotoManagementSpec.scala:25)
[error] test.PhotoManagementSpec$anonfunTesten Sie MultipartFormData in Play 2.0 FakeRequest$anonfun$apply$3.apply(PhotoManagementSpec.scala:25)
Wenn ich versuche, das veraltete routeAndCall durch nur route zu ersetzen (und die Option around result entferne), erhalte ich einen Kompilierungsfehler, der besagt, dass keine Instanz von MultipartFormData [TemporaryFile] in die HTTP-Antwort geschrieben werden kann.
Wie kann ich diesen Test in Play 2.1 mit Scala richtig gestalten?
Bearbeiten: Versucht, den Code zu ändern, um nur den Controller zu testen:
"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")
}
Aber ich bekomme jetzt einen Tippfehler bei allen Testbedingungen um die Ergebnisse herum wie folgt:
[error] found : play.api.libs.iteratee.Iteratee[Array[Byte],play.api.mvc.Result]
[error] required: play.api.mvc.Result
Ich verstehe nicht, warum ich einen Interator für Byte-Arrays erhalte, die den Ergebnissen zugeordnet sind. Könnte dies etwas damit zu tun haben, wie ich einen benutzerdefinierten Body-Parser verwende? Die Definition meines Controllers sieht folgendermaßen aus:
def upload = Action(CustomParsers.multipartFormDataAsBytes) { request =>
request.body.file("qqfile").map { upload =>
Verwenden Sie den Formular-Parser aus diesem Beitrag:Abrufen von Dateien aus MultipartFormData im Speicher in Play2 / Scala