【问题标题】:How to test file upload in Grails如何在 Grails 中测试文件上传
【发布时间】:2013-05-12 15:18:24
【问题描述】:

我有一个控制器,它接收一个文件作为参数的一部分。我想知道我该如何测试这个?

我的控制器操作:

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 测试文件夹中。如何执行?

【问题讨论】:

    标签: unit-testing testing grails junit


    【解决方案1】:

    我使用的是 Grails 2.4,您可以在单元测试中简单地使用 GrailsMockMultipartFile 和 request.addFile 方法。

    此代码适用于带有 Spock 测试框架的 Grails 2.4.4:

    控制器端:

    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)
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      由于在文件上传期间请求将是multipart,因此实际的请求servlet 将是MultipartHttpServletRequest。对于单元测试用例,mock 和controller 中的request 相同。成功模拟后,您应该能够在测试中使用 addFile,在 action 中使用 getFile。

      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
          }
      }
      

      【讨论】:

        【解决方案3】:

        接受的答案对我不起作用。下面的代码做了:

        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
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-11-13
          • 2012-12-27
          • 2016-07-24
          • 2014-07-28
          • 2019-10-27
          • 1970-01-01
          • 2021-01-27
          • 1970-01-01
          相关资源
          最近更新 更多