通过元类重写 grails 控制器链方法没有效果

发布于 2024-12-03 06:03:57 字数 1161 浏览 2 评论 0原文

考虑以下控制器:

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)
    }
}

为什么最后两个测试失败?

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() 
    {
        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?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

小ぇ时光︴ 2024-12-10 06:03:58

很抱歉,您错过了对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)
}

所有测试通过测试你的代码之后。

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文