开发者

Overriding grails controller chain method via metaClass having no effect

Consider the following controller:

package test

class FirstController 
{
    def index = 
    { 
        chain(controller:"second",
              action: "index")
    }
}

... with the following associated unit test case:

package test

import grails.test.*

class FirstControllerTests extends ControllerUnitTestCase 
{
    protected void setUp(开发者_C百科) 
    {
        super.setUp()
    }

    protected void tearDown() 
    {
        super.tearDown()
    }

    // Passes
    void testChainArgs() 
    {
        controller.index()

        assertEquals('index', controller.chainArgs.action)
        assertEquals('second', controller.chainArgs.controller)
    }

    // Fails
    void testOverrideInstanceChain()
    {
        def passTest = false

        controller.metaClass.chain = 
        {
            Map args ->

            passTest = true
        }

        assertTrue(passTest)
    }

    // Fails
    void testOverrideClassChain()
    {
        def passTest = false

        FirstController.metaClass.chain =
        {
            Map args ->

            passTest = true
        }

        assertTrue(passTest)
    }
}

Why are the last two tests failing?


I am sorry, but you miss the invocation to the controller.index().

After I test out your code with

void testOverrideInstanceChain()
{
    def passTest = false

    controller.metaClass.chain =
    {
        Map args ->

        passTest = true
    }
    controller.index()

    assertTrue(passTest)
}

and

void testOverrideClassChain()
{
    def passTest = false

    FirstController.metaClass.chain =
    {
        Map args ->

        passTest = true
    }
    controller.index()
    assertTrue(passTest)
}

All tests pass.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜