0

在我的 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 的新手。

4

1 回答 1

2

mockController不会嘲笑GrailsApplication,你需要自己做。

最快的解决方案是:

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

这个解决方案并不完美 - 它会DefaultGrailsApplication在每次设置期间创建一个新的,并且mockController还会创建一些额外的DefaultGrailsApplication.

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

于 2013-03-19T14:33:44.873 回答