2013-05-12 5 views
4

У меня есть контроллер, который принимает файл как часть параметра. Мне интересно, как я могу это проверить?Как проверить загрузку файла в Grails

мой контроллер действия:

def save() { 
    def colorInstance = new Color(params.color) 
    CommonsMultipartFile file = request.getFile('color.filename') 
    fileUploadService.upload(colorInstance, file, "foldername") 
    if (requestInstance.save(flush: true)) { 
    withFormat { 
     html {redirect(action: "list") } 
     js {render "test"} 
    } 
    } 
} 

Я начал что-то вроде этого: ...

import org.junit.Before 
import grails.test.mixin.Mock 
import grails.test.mixin.TestFor 

@TestFor(ColorController) 
@Mock(Color) 
class ColorControllerTests { 

    @Before 
    void setUp() { 
     controller.fileUploadService = new FileUploadService 
    } 
} 

Вопрос

  • Я не могу понять, как для тестирования загрузки CommonsMultipartFile.
  • Кроме того, этот тестовый пример будет находиться в тестовой папке unit. Как я могу его выполнить?

ответ

5

Поскольку запрос будет multipart во время загрузки файла, фактический запрос сервлета будет MultipartHttpServletRequest. Для блок-теста, mock, то же самое и используйте его как request в controller. При успешном издевательстве вы должны быть в состоянии addFile в тестах и ​​getFile в action.

import org.junit.Before 
import grails.test.mixin.Mock 
import grails.test.mixin.TestFor 

@TestFor(ColorController) 
@Mock(Color) 
class ColorControllerTests { 

    @Before 
    void setUp() { 
     controller.fileUploadService = new FileUploadService 
     //Mock MultipartHttpServletRequest somethign like below 
     controller.metaClass.request = mockFor(MultipartHttpServletRequest).createMock() 
    } 

    void testFileUpload(){ 
     //Add a mock multipart file to request 
     controller.request.addFile(new MockMultipartFile('myFile', 'IronMan3.jpg', 'image/jpeg', "1234567" as byte[])) 

     //call the controller action 
     //assert response 
    } 
} 
1

Принятый ответ не сработал для меня. Следующий код сделал:

import org.junit.Before 
import grails.test.mixin.Mock 
import grails.test.mixin.TestFor 
import org.springframework.mock.web.MockMultipartHttpServletRequest 
import org.springframework.mock.web.MockMultipartFile 

@TestFor(ColorController) 
class ColorControllerTests { 

    def mockRequest 

    @Before 
    void setUp() { 
     mockRequest = new MockMultipartHttpServletRequest() 
     controller.metaClass.request = mockRequest 

     // your service here 
     controller.fileUploadService = new FileUploadService 
    } 

    void testFileUpload(){ 
     //Add a mock multipart file to request 
     mockRequest.addFile(new MockMultipartFile('myFile', 'IronMan3.jpg', 'image/jpeg', "1234567" as byte[])) 

     //call the controller action 
     //assert response 
    } 
} 
5

Я использую Grails 2.4, и вы можете просто использовать GrailsMockMultipartFile и request.addFile метод в тестовом модуле.

Этот код работает на Grails 2.4.4, с рамками тестирования Spock:

контроллера сторона:

class FileUploadController { 

    def upload() { 
     def multipartFile = request.getFile('requestParamName') 
     if (multipartFile.empty) { 
      flash.message = 'Error: file cannot be empty' 
      render(view: 'upload') 
      return 
     } 

     // do something now with your file 
    } 
} 

тест блока сторона:

import grails.test.mixin.TestFor 
import org.codehaus.groovy.grails.plugins.testing.GrailsMockMultipartFile 
import spock.lang.Specification 

@TestFor(FileUploadController) 
class FileUploadControllerSpec extends Specification { 

    void "upload should add flash error message if empty file in request"() { 
     given: 
     def multipartFile = new GrailsMockMultipartFile('requestParamName', 'someExcelFile.xls', 'application/vnd.ms-excel', new byte[0]) 
     request.addFile(multipartFile) 

     when: 
     controller.upload() 

     then: 
     assertEquals('Error: file cannot be empty', flash.message) 
    } 

} 
Смежные вопросы