在对grails中的控制器执行单元测试时,不能使用grailsApplication.getMetadata.get(“”)

时间:2013-03-19 12:29:52

标签: unit-testing grails junit4 grails-controller

在我的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 test-app”时,我希望它会从application.properties中获取属性“xyz”,并将按预期返回。但它给出的错误是“没有这样的属性:grailsApplication”。

我理解,我想我需要模仿grailsApplication对象,我也尝试了许多选项但是所有这些都没有用。

我是Grails的新手。

1 个答案:

答案 0 :(得分:2)

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

最快的解决方案是:

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

此解决方案并不完美 - 它会在每次设置期间创建新的DefaultGrailsApplication,而mockController也会创建一些DefaultGrailsApplication的其他实例。

请注意,您无需亲自致电mockControllerControllerUnitTestCase将为您完成。