gpt4 book ai didi

grails - 如何根据环境覆盖 resources.groovy 中的 Controller ?

转载 作者:行者123 更新时间:2023-12-02 15:10:55 24 4
gpt4 key购买 nike

我有一个场景,我想在功能测试期间覆盖某些 Controller ,以便在运行时调用模拟 Controller 。我可以像这样轻松地覆盖 resources.groovy 中的服务:(记录在 herehere 中。)

 // grails-app/conf/spring/resources.groovy
beans = {
switch(Environment.current) {
case Environment.TEST:
expensiveToUseService(MockExpensiveToUseService)

break
}
}

当应用程序在测试环境中运行时,这种方法会正确重定向到模拟服务。

但是,与 Controller 一起使用的相同方法不起作用。这是我目前的尝试:
// grails-app/conf/spring/resources.groovy
beans = {
switch(Environment.current) {
case Environment.TEST:
expensiveToUseController(MockExpensiveToUseController)

break
}
}

模拟 Controller 与原始 Controller 位于同一目录/包中,位于 grails-app/controllers 下。

我能看到的唯一明显区别是我的服务在代码中被使用它们的 Controller 显式引用,例如
class ExpensiveToUseController { 
def expensiveToUseService
...
}

另一方面, Controller 仅由 Grails 运行时引用。

可能值得一提的是,我没有将现有 Controller 中的逻辑移到服务中的选项,这将提供一种解决方法。

我在这里缺少什么,还是有另一种方法可以实现这一目标?

编辑:见下面的答案。

对于遇到此问题的其他人,我不需要额外的 bean.scope/autowire 参数。这是我的 DSL:
beans = {
switch(Environment.current) {
case Environment.TEST:
'com.example.ExpensiveToUseController'(com.example.MockExpensiveToUseController)

break
}
}

最佳答案

由于它们不是可 Autowiring 的,因此 Controller 在 spring 上下文中注册在与其完全限定的类名称匹配的 bean 名称下,而不是服务使用的“属性名称”表示。因此,您需要将您的测试 bean 注册为 com.example.ExpensiveToUseController而不是 expensiveToUseController .

但是将环境检查放在 Controller 本身的“昂贵”操作中可能更容易。我认为实例化 Controller 的行为不会太昂贵,因为默认情况下 Controller 是原型(prototype)范围。

关于grails - 如何根据环境覆盖 resources.groovy 中的 Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15701680/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com