Escrevendo um caso de teste para uploads de arquivos no Play 2.1 e no Scala
Eu encontrei a seguinte pergunta / resposta:
Teste MultipartFormData no Play 2.0 FakeRequest
Mas parece que as coisas mudaram no Play 2.1. Eu tentei adaptar o exemplo da seguinte forma:
"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")
No entanto, sempre que eu tento executar a solicitação, recebo uma exceção de ponteiro nulo:
[error] ! Upload Photo
[error] NullPointerException: null (PhotoManagementSpec.scala:25)
[error] test.PhotoManagementSpec$anonfunTeste MultipartFormData no Play 2.0 FakeRequest$anonfun$applyNo entanto, sempre que eu tento executar a solicitação, recebo uma exceção de ponteiro nulo:$anonfun$apply$4.apply(PhotoManagementSpec.scala:28)
[error] test.PhotoManagementSpec$anonfunTeste MultipartFormData no Play 2.0 FakeRequest$anonfun$applyNo entanto, sempre que eu tento executar a solicitação, recebo uma exceção de ponteiro nulo:$anonfun$apply$4.apply(PhotoManagementSpec.scala:25)
[error] play.api.test.Helpers$.running(Helpers.scala:40)
[error] test.PhotoManagementSpec$anonfunTeste MultipartFormData no Play 2.0 FakeRequest$anonfun$apply$3.apply(PhotoManagementSpec.scala:25)
[error] test.PhotoManagementSpec$anonfunTeste MultipartFormData no Play 2.0 FakeRequest$anonfun$apply$3.apply(PhotoManagementSpec.scala:25)
Se eu tentar substituir o routeAndCall obsoleto por apenas route (e remover a Option around result), recebo um erro de compilação declarando que ele não pode gravar uma instância de MultipartFormData [TemporaryFile] na resposta HTTP.
Qual é o caminho certo para projetar este teste no Play 2.1 com o Scala?
Editar: Tentei modificar o código para testar apenas o controlador:
"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")
}
Mas agora eu recebo um erro de tipo em todas as condições de teste em torno dos resultados da seguinte forma:
[error] found : play.api.libs.iteratee.Iteratee[Array[Byte],play.api.mvc.Result]
[error] required: play.api.mvc.Result
Não entendo porque estou obtendo um Interator para matrizes de bytes mapeadas para Resultados. Isso poderia ter algo a ver com o uso de um analisador de corpo personalizado? A definição do meu controlador é assim:
def upload = Action(CustomParsers.multipartFormDataAsBytes) { request =>
request.body.file("qqfile").map { upload =>
Usando o analisador de formulário desta postagem:Puxando arquivos de MultipartFormData na memória no Play2 / Scala