Grails 如何测试具有Basecontroller的@Mixin的控制器

Grails 如何测试具有Basecontroller的@Mixin的控制器,grails,spock,Grails,Spock,我已经创建了一个BaseController,可以混入其他控制器 例如: class BaseController () { def somemethod () { return "some method" } } @Mixin(BaseController) class MyController { def getsomething() { def test = somemethod() return test } } 我正在尝试为MyCo

我已经创建了一个BaseController,可以混入其他控制器

例如:

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

MyController
的spock测试中使用
@TestMixin(BaseController)
是否有效?
答:不,这不是必需的

更新
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"
    }
}
注意事项:-
我在测试时发现了一些困难,如下所示:-

  • 上述测试通过了初始运行。但是,当我将
    render
    更改为
    return
    只是为了看到我的测试失败时,我得到了编译错误,因为我在
    MyController
    中使用了Grails
    @Mixin
    (两个版本的
    with format
    )。有时候我觉得打得不好。将mixin更改为Groovy
    @mixin
    一切都很顺利。我不喜欢那样。我必须坚持使用Grails
    @Mixin
    。显然,令人惊讶的是,执行
    grails清理和&grails编译
    消除了这个问题。我能够正确地使用Grails@Mixin。我仍在关注这一差异

  • 如果上述问题持续存在,我会考虑在单元测试的
    setup()
    方法中添加运行时mixin

  • 在集成测试中,我使用了
    ControllerSpec
    而不是
    IntegrationSpec
    。在控制器的
    ControllerSpec
    中,注入和约定似乎得到了更好的维护。如果你看到了,我在int测试中没有实例化MyContoller

  • 我还没有在普通Junit的单元和集成测试中测试过它,它们也应该很好


我的强烈建议是不要在Grails中使用mixin。它在测试中生成错误的bahvior。此外,您还需要一个额外的代码来将这些混合应用于测试,这是不好的


有关更多信息,请阅读此replay:,它通常适用于Grails中的混合,或者查看此问题评论中报告的许多问题:(类在单元测试期间丢失了它们的混合)。

基于此线程中的答案

最后我用了

void setup() {
    MyController.mixin(BaseController)
}

它没有:(我已经尝试了
@TestMixin
以及
@Mixin
在spock测试中对
MyController
进行了测试,我不确定在这种情况下是否可以使用
TestFor
TestMixin
。我将进行测试并让您知道。我已经在使用
TestFor
,并且它不需要多个参数。)either@Anthony看到我的更新了吗n回答。
@TestFor
仅用于一个参数;控制器、服务、域或简单类。请查看
void setup() {
    MyController.mixin(BaseController)
}