测试使用请求对象的自定义Grails TagLib方法

时间:2013-08-16 22:27:25

标签: unit-testing grails mocking httprequest taglib

总计'测试新手'想要测试我的自定义TagLib的addJsFile方法。我错过了什么?

的TagLib:

import com.company.group.application.helper.Util
...   
class MyTagLib {
    static namespace = 'mytag'
    def util
    ...
    def addJsFile = {
        if (util.isSecureRequest(request)) {
            out << '<script src="https://domain.com/jsfile.js"></script>'
        } else {
            out << '<script src="http://domain.com/jsfile.js"></script>'
        }
    }
}

测试(据我所知):

import org.springframework.http.HttpRequest
import com.company.group.application.helper.Util

@TestFor(MyTagLib)
class MyTagLibTests {
    def util
    ...
    void testAddJsFileSecure() {
        def mockUtil = mockFor(Util)
        mockUtil.demand.isSecureRequest() { HttpRequest request -> true }
        def jsCall = applyTemplate('<mytag:addJsFile />')
        assertEquals('<script src="https://domain.com/jsfile.js"></script>', jsCall)
    }
    void testAddJsFileNotSecure() {
        def mockUtil = mockFor(Util)
        mockUtil.demand.isSecureRequest() { HttpRequest request -> false }
        def jsCall = applyTemplate('<mytag:addJsFile/>')
        assertEquals('<script src="http://domain.com/jsfile.js"></script>', jsCall)
    }
}

Util isSecureRequest

boolean isSecureRequest(request) {
    return [true or false]
}

错误

org.codehaus.groovy.grails.web.taglib.exceptions.GrailsTagException: Error executing tag <mytag:addJsFile>: Cannot invoke method isSecureRequest() on null object

1 个答案:

答案 0 :(得分:2)

您需要在util中设置模拟的tagLib才能使用它。

void testAddJsFileSecure() {
    def mockUtilControl = mockFor(Util)
    mockUtilControl.demand.isSecureRequest() { HttpRequest request -> true }

    //"tagLib" is the default bind object provided 
    //by the mock api when @TestFor is used
    tagLib.util = mockUtilControl.createMock()

    //Also note mockFor() returns a mock control 
    //which on createMock() gives the actual mocked object

    def jsCall = applyTemplate('<mytag:addJsFile />')
    assertEquals('<script src="https://domain.com/jsfile.js"></script>', jsCall)

    //In the end of test you can also verify that the mocked object was called
    mockUtilControl.verify()
}

然后在测试中你不需要def util

相关问题