Переопределение метода цепочки контроллеров Grails через metaClass без эффекта - PullRequest
0 голосов
/ 08 сентября 2011

Рассмотрим следующий контроллер:

package test

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

... со следующим связанным модульным тестом:

package test

import grails.test.*

class FirstControllerTests extends ControllerUnitTestCase 
{
    protected void setUp() 
    {
        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)
    }
}

Почему два последних теста не пройдены?

1 Ответ

1 голос
/ 08 сентября 2011

Извините, но вы пропускаете вызов к controller.index ().

После того, как я проверил ваш код с

void testOverrideInstanceChain()
{
    def passTest = false

    controller.metaClass.chain =
    {
        Map args ->

        passTest = true
    }
    controller.index()

    assertTrue(passTest)
}

и

void testOverrideClassChain()
{
    def passTest = false

    FirstController.metaClass.chain =
    {
        Map args ->

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

Все тесты пройдены.

...