Reza
Reza

Reputation: 739

Testing Grails controller with multipart request

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

Answers (3)

Damien Beaufils
Damien Beaufils

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

Reza
Reza

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

Tobias Kraft
Tobias Kraft

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

Related Questions