Reputation: 739
I have written a controller in Grails which accepts multipart request (xml+binary file1+binary file2+...). How can I unit test that controller? How could I set the content of the request in unit tests? Any sample code is appreciated!
Upvotes: 1
Views: 2378
Reputation: 554
I am using Grails 2.4, and you can simply use GrailsMockMultipartFile
and request.addFile
method in your unit test.
This code works on Grails 2.4.4, with Spock testing framework:
Controller side:
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
}
}
Unit test side:
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)
}
}
Upvotes: 6
Reputation: 739
I got it from : http://roshandawrani.wordpress.com/2011/02/03/grails-mock-testing-a-file-upload/ and it is working. Here is the sample:
import org.springframework.mock.web.MockMultipartFile
import org.springframework.mock.web.MockMultipartHttpServletRequest
class FileUploadControllerTests extends grails.test.ControllerUnitTestCase
{
void testFileUpload()
{
def imgContentType = 'image/jpeg'
def imgContentBytes = '123' as byte[]
....
....
controller.metaClass.request = new MockMultipartHttpServletRequest()
controller.request.addFile(
new MockMultipartFile('image', 'myImage.jpg', imgContentType, imgContentBytes) )
....
controller.save()
assertEquals HttpServletResponse.SC_OK, controller.response.status
....
}
}
Upvotes: 2
Reputation: 348
We are using Spock and our code looks like this:
def mockFile = new MockMultipartFile(Constants.PARAM_DA_FILE, 'filename.xls', 'application/vnd.ms-
excel', articleFile.bytes)
params.(Constants.PARAM_DA_FILE) = mockFile
controller.request.addFile(mockFile)
Upvotes: 2