Unit testing 如何在Grails中测试文件上传

Unit testing 如何在Grails中测试文件上传,unit-testing,testing,grails,junit,Unit Testing,Testing,Grails,Junit,我有一个控制器,它接收一个文件作为参数的一部分。我想知道我怎样才能测试这个 我的控制器操作: def save () { def colorInstance = new Color(params.color) CommonsMultipartFile file = request.getFile('color.filename') fileUploadService.upload(colorInstance, file, "foldername") if (requestInst

我有一个控制器,它接收一个文件作为参数的一部分。我想知道我怎样才能测试这个

我的控制器操作:

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

  • 我不知道如何测试
    commonmultipartfile
    文件上传
  • 此外,此测试用例将位于
    unit
    test文件夹中。我如何执行它

由于在文件上载期间请求将是
多部分的
,因此实际的请求servlet将是
multipathttpservletrequest
。对于单元测试用例,
mock
与之相同,并将其用作
controller
中的
请求。成功模拟后,您应该能够在测试中
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
    }
}

被接受的答案对我不起作用。以下代码没有:

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

我使用的是Grails2.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)
    }

}