2013-03-19 28 views
0

在我的Grails应用程序控制器进行单元测试,在控制器中,我使用以下类似的事情:不能使用grailsApplication.getMetadata.get(”“),而在Grails中

class SampleController { 
    def action1 = { 
    def abc = grailsApplication.getMetadata().get("xyz") 
    render abc.toString() 
    } 
} 

当运行应用程序,它正确地从application.properties中读取属性“xyz”并且正常工作。但是,当我写一个单元测试用例上述控制器如下:

class SampleControllerTests extends ControllerUnitTestCase { 
    SampleController controller 

    protected void setUp() { 
    super.setUp() 
    controller = new SampleController() 
    mockController(SampleController) 
    mockLogging(SampleController) 
    } 

    void testAction1() { 
    controller.action1() 
    assertEquals "abc", controller.response.contentAsString 
    } 
} 

但是当我做“的Grails测试应用程序”,我期望它会拿起从application.properties属性“XYZ”和将按预期返回。但它错误为“没有这样的属性:grailsApplication”。

我明白了,我想我需要模拟grailsApplication对象,并且我尝试了很多选项但是所有这些都不起作用。

我是新来的Grails。

+0

你使用的是女巫版的grails吗? – 2013-03-19 13:04:32

+0

版本:grails 1.3.7 – user2186466 2013-03-19 13:21:04

+0

您可能需要考虑将abc的值注入到控制器中,以便将控制器从grailsApplication的显式依赖中释放。 – 2013-03-19 15:36:48

回答

2

mockController不会嘲笑GrailsApplication,您需要自己动手。

最快的解决办法是这样的:

protected void setUp() { 
     super.setUp() 
     mockLogging(DummyController) 
     GrailsApplication grailsApplication = new DefaultGrailsApplication() 
     controller.metaClass.getGrailsApplication = { -> grailsApplication } 
    } 

该解决方案是不完美的 - 它在每次安装过程中创建一个新的DefaultGrailsApplicationmockController也创造了DefaultGrailsApplication一些额外的实例。

请注意,您不需要自己拨打mockController,它将由ControllerUnitTestCase为您完成。

+0

谢谢drorb。我尝试了您提供的解决方案,并按预期工作。非常感谢!!!!!!!!! :) – user2186466 2013-03-20 08:43:36

+0

很高兴听到它帮助:-)。如果可以,请将此问题标记为已解答 - 谢谢 – 2013-03-20 08:53:57

相关问题