Игра 2.4: Как написать тестовый пример для загрузки файла с помощью MultipartFormData

До сих пор (до Play 2.3) для создания фиктивного запроса я использовал Helpers.fakeRequest().withAnyContent(). Например.

private Request getMultiPartFormDataRequestForFileUpload(File file,
        String filePartKey, String contentType) {
    FilePart<TemporaryFile> part = new MultipartFormData.FilePart<>(
            filePartKey, file.getName(), Scala.Option(contentType),
            new TemporaryFile(file));
    List<FilePart<TemporaryFile>> fileParts = new ArrayList<>();
    fileParts.add(part);
    scala.collection.immutable.List<FilePart<TemporaryFile>> files = scala.collection.JavaConversions
            .asScalaBuffer(fileParts).toList();
    MultipartFormData<TemporaryFile> formData = new MultipartFormData<TemporaryFile>(
            null, files, null, null);
    return Helpers.fakeRequest().withAnyContent(formData);
}

В Play 2.4 это больше невозможно. Если я посмотрю на источник RequestBuilder (который реализован FakeRequest) похожая функция существует, но она защищена и я не могу ее использовать.

protected Http.RequestBuilder   body(play.api.mvc.AnyContent anyContent)
Set a AnyContent to this request.

Кто-нибудь знает, как я могу написать тестовый пример для проверки загрузки файла с помощью MultipartFormData в версии 2.4?


person Kris    schedule 27.11.2015    source источник


Ответы (2)


Поскольку Helpers.fakeRequest — очень и очень простой метод (взято с github)

/**
 * Build a new GET / fake request.
 */
public static RequestBuilder fakeRequest() {
    return fakeRequest("GET", "/");
}

/**
 * Build a new fake request.
 */
public static RequestBuilder fakeRequest(String method, String uri) {
    return new RequestBuilder().method(method).uri(uri);
}

вы можете расширить Http.RequestBuilder, получив таким образом доступ к защищенному методу:

public class FakeRequestBuilder extends HttpRequestBuilder() {
   public RequestBuilder setAnyBody(RequestBody body, String contentType) {
     header("Content-Type", contentType);
     body(body);
   }
}

И используйте это в своем тесте:

 //OLD return Helpers.fakeRequest().withAnyContent(formData);
 //NEW
 return new FakeRequestBuilder().setAnyBody(formData, "multipart/form-data").build(); 
 //or is it application/x-www-form-urlencoded for you?
person Jan    schedule 30.11.2015
comment
Спасибо! Я попробую позже. - person Kris; 30.11.2015
comment
Спасибо, Ян, но это не сработало. Извините за поздний ответ (лучше поздно, чем никогда). С вашим FakeRequestBuilder я получаю scala.MatchError: AnyContentAsMultipartFormData. Но мой тип контента — application/zip. Я предполагаю, что это связано с stackoverflow.com/questions/32791562/. - person Kris; 06.04.2016

В Play2.4 body() не принимает RequestBody, и вам нужно сначала создать AnyContent из multipart. Пример:

private class FakeRequestBuilder extends Http.RequestBuilder {
    public FakeRequestBuilder(String method, String uri) {
        method(method).uri(uri);
    }

    protected RequestBuilder setAnyBody(MultipartFormData<TemporaryFile> formData, String contentType) {
        header("Content-Type", contentType);
        AnyContent anyContent = new AnyContentAsMultipartFormData(formData);
        body(anyContent);
        return this;
    }
}

Например, таким образом можно создать MultiPartFormData:

private MultipartFormData<TemporaryFile> createFormData(String contentType, String filePartKey, File file) {
    FilePart<TemporaryFile> part = new MultipartFormData.FilePart<>(filePartKey, file.getName(), Scala.Option(contentType), new TemporaryFile(file));
    List<FilePart<TemporaryFile>> fileParts = new ArrayList<>();
    fileParts.add(part);
    scala.collection.immutable.List<FilePart<TemporaryFile>> files = scala.collection.JavaConversions.asScalaBuffer(fileParts).toList();
    MultipartFormData<TemporaryFile> formData = new MultipartFormData<TemporaryFile>(null, files, null, null);
    return formData;
}
person rwijngaa    schedule 29.03.2016
comment
Спасибо за вашу помощь. Я попробовал ваше решение. И я также пытался использовать макет с Mockito. В обоих случаях я получаю scala.MatchError: AnyContentAsMultipartFormData, который, кажется, относится к этой проблеме java-play-framework-2-3-x" title="загрузка файла модульного тестирования в контроллер с java play framework 2 3 x">stackoverflow.com/questions/32791562/. - person Kris; 06.04.2016