gpt4 book ai didi

grails - 如何测试具有 Basecontroller 的 @Mixin 的 Controller

转载 作者:行者123 更新时间:2023-12-04 23:23:46 26 4
gpt4 key购买 nike

我创建了一个 BaseController,我将它混入其他 Controller 。

例子:

class BaseController () {
def somemethod () {
return "some method"
}
}

@Mixin(BaseController)

class MyController {
def getsomething() {
def test = somemethod()
return test
}
}

我正在尝试为 MyController 编写测试用例但是,它失败了,因为它找不到 somemethod .

我的测试目前看起来像这样
@TestFor(MyController)
class MyControllerSpec extends Specification {
def "test getsomething" () {
when:
def m = controller.getsomething()
then:
response.contentAsString == "some method"
}
}

但我不断收到这样的错误:
No signature of method: somemethod() is applicable for argument types: () values: []

问题

如何为 MyController 编写 spock 测试以便它找到 somemethod以及

最佳答案

是否使用 @TestMixin(BaseController)MyController 的 Spock 测试中工作?
答:- 不,这不是必需的。

更新 MyController 中需要进行小修改.使用render而不是 return .这是详细信息:

class BaseController {
def someMethod() {
"Some Method"
}
}

import grails.util.Mixin
//Remember to use Grails @Mixin instead of Groovy @Mixin
@Mixin(BaseController)
class MyController {
def getSomething() {
def test = someMethod()
render test
}
}

//Unit Test
@TestFor(MyController)
class MyControllerUnitSpec extends Specification {
void "test get something"() {
when:
controller.getSomething()
then:
response.contentAsString == "Some Method"
}
}

//Controller Integration Test
import grails.plugin.spock.ControllerSpec
class MyControllerIntSpec extends ControllerSpec {
void "test get something integration"() {
when:
controller.getSomething()
then:
controller.response.contentAsString == "Some Method"
}
}

备注:-
我在测试时发现了一些困难,如下所列:-
  • 上述测试在初始运行时通过。但是,当我更改 renderreturn只是为了看到我的测试失败,我因为 Grails @Mixin 而出现编译错误我用在 MyController (withFormat 的两个版本)。有时我觉得它玩得不好。将 mixin 更改为 Groovy @Mixin一切顺利。我不喜欢那样。我不得不坚持使用 Grails @Mixin .显然,令人惊讶的是,做 grails clean && grails compile根除这个问题。我能够正确使用 Grails @Mixin。我仍在研究这种差异。
  • 如果上述问题持续存在,我会考虑在 setup() 中添加运行时混合。单元测试中的方法。


  • def setup(){
    //I would not like to do the same in Integration test
    //Integration test should do it for me atleast.
    MyController.mixin BaseController
    }
  • 我用了ControllerSpec而不是 IntegrationSpec在集成测试中。似乎注入(inject)和约定在 ControllerSpec 中维护得更好对于 Controller 。如果你看到了,我没有实例化 MyContoller在 int 测试中。
  • 我没有在正常的 Junit 的单元和集成测试中对其进行测试,它们也应该很好。
  • 关于grails - 如何测试具有 Basecontroller 的 @Mixin 的 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16995116/

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