Test multipart request in Grails

Прошло относительно немного времени с момента последнего поста и я уже нахожусь на родине :). Вторую часть повествования моего пребывания заграницей я продолжу в следующий раз, а сегодня хочу поделиться одним незатейливым решением одной небольшой проблемы.

И так, немного вводной информации – на данный момент происходит мое знакомство с Grails методом написания демо-проекта. И в одной из задач проекта была реализация возможности загружать файлы, а именно изображения на сервер. Сам процесс загрузки собственно не сложен, а как и все в Grails, очень прост. Возможность загрузки файлов обеспечивается с помошью установки аттрибута формы enctype в виде:

<g:form action="save" enctype="multipart/form-data">
...
</g:form>

Либо следующим образом, разница только в том, что enctype уже “multipart/form-data”

<g:uploadForm action="save">
...
</g:uploadForm >

А в котроллере файл можно получить следующим образом:

def multipartFile = request.getFile('file')

где “file” – имя параметра из запроса, далее с этим объектом можно работать как со стандартным http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/multipart/MultipartFile.html.

Но собственно вернемся к проблеме, которая заключается в тест ировании загрузки файла на сервер. Как оказалось моковый объект запроса в контроллере не поддерживает multipart запросы.

К счастью, Groovy распологает возможностью динамически расширять возможности объекта в режиме выполнения. Это обеспечивается с помошью Mixin. Таким образом с помошью следующей конструкции я могу расширить возможности стандартного мокового объекта запроса:

....
def controller = new SomeController()
def imageMultipartFile = new MockMultipartFile("file", "test_image.jpg", "image/jpg", file.readBytes())
//add multipart nature to the mock request
controller.request.metaClass.mixin MockMultipartHttpServletRequest
controller.request.addFile(imageMultipartFile)
....

Собственно на этом все, проблема с невозможностью протестировать загрузку файла решена. Спасибо за внимание и удачного тестирования.

Leave a Reply

Your email address will not be published. Required fields are marked *