Прошло относительно немного времени с момента последнего поста и я уже нахожусь на родине
. Вторую часть повествования моего пребывания заграницей я продолжу в следующий раз, а сегодня хочу поделиться одним незатейливым решением одной небольшой проблемы.
И так, немного вводной информации – на данный момент происходит мое знакомство с 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) ....
Собственно на этом все, проблема с невозможностью протестировать загрузку файла решена. Спасибо за внимание и удачного тестирования.