Schreiben fand ich die folgende Frage/Antwort:einen Testfall für das Hochladen von Dateien in Play 2.1 und Scala
Test MultipartFormData in Play 2.0 FakeRequest
Aber es scheint, die Dinge in Play 2.1 geändert haben. Ich habe versucht, wie das Beispiel der Anpassung so:
"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")
Allerdings, wenn ich versuche, um die Anforderung zu laufen, ich habe eine Null-Zeiger-Ausnahme erhalten:
[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)
Wenn ich versuche, den veralteten routeAndCall zu ersetzen einfach weiterleiten (und das Option around-Ergebnis entfernen), bekomme ich einen Kompilierfehler, der besagt, dass es keine Instanz von MultipartFormData [TemporaryFile] in die HTTP-Antwort schreiben kann.
Was ist der richtige Weg, um diesen Test in Play 2.1 mit Scala zu entwickeln?
bearbeiten: Versucht, den Code zu ändern, nur die Steuerung 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 nun einen Typfehler auf allen Testbedingungen um die Ergebnisse wie so erhalten:
[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 Interoperator für Byte-Arrays auf Ergebnisse zugeordnet bin. Könnte das etwas damit zu tun haben, wie ich einen benutzerdefinierten Body Parser verwende? Mein Controller-Definition sieht wie folgt aus:
def upload = Action(CustomParsers.multipartFormDataAsBytes) { request =>
request.body.file("qqfile").map { upload =>
Mit dem Formular-Parser aus diesem Beitrag: Pulling files from MultipartFormData in memory in Play2/Scala
Eine ähnliche Frage gestellt und beantwortet wurde: http://stackoverflow.com/questions/15013177/serializing-multipart-form-requests-for-testing -on-play-2-1/15013786 # 15013786 – EECOLOR
Ich sehe die Frage und Antwort, aber es ist immer noch wirklich verwirrend und nicht gut beantwortet. Sie verweisen auf die offizielle Dokumentation, die ich gelesen habe und die keine mehrteiligen Formulardaten abdeckt. Ich würde auch gerne die Route testen, aber ich denke, das Testen des Controllers wird es tun. Ich verstehe immer noch nicht, wie man die Datei mit dem Namen "qqfile" an den Körper weitergibt. Könnten Sie Ihre Frage mit einer vollständigen Antwort bearbeiten? – djsumdog
Es wurde versucht, nur den Controller zu testen, aber es traten dennoch einige Probleme auf. Bearbeiten ist oben aufgeführt. – djsumdog