我有一个控制器,在文件中采用作为参数的一部分。 我不知道如何测试呢?
我的控制器操作:
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
测试文件夹。 我该如何执行呢?
由于该请求将被multipart
文件上传过程中,实际的请求的servlet会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
}
}
我使用的Grails 2.4,你可以简单地使用GrailsMockMultipartFile
和request.addFile
方法在你的单元测试。
此代码的工作中,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)
}
}
接受的答案并没有为我工作。 下面的代码所做的:
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
}
}