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
- 此外,此测试用例将位于
test文件夹中。我如何执行它unit
多部分的
,因此实际的请求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)
}
}