4

我创建了一个 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: []

问题

我如何编写 spock 测试MyController以便它也能somemethod找到

4

3 回答 3

4

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

更新.
_ 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只是看到我的测试失败时,由于@Mixin我在MyController(两个版本withFormat)中使用的 Grails,我得到了编译错误。有时我觉得它玩得不好。将 mixin 更改为 Groovy@Mixin一切都很顺利。我不喜欢那样。我不得不坚持 Grails @Mixin。显然和令人惊讶的是,做一个grails clean && grails compile根除这个问题。我能够正确使用 Grails @Mixin。我仍在研究这种差异。

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

喜欢

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似乎注入和约定在ControllerSpec控制器中维护得更好。如果你看到了,我没有MyContoller在 int 测试中实例化。

  • 我没有在正常的 Junit 的单元和集成测试中对其进行测试,它们也应该很好。

于 2013-06-08T01:36:59.263 回答
3

我强烈建议不要在 Grails 中使用 mixins。它在测试中产生错误的行为。此外,您还需要额外的代码来应用这些 mixin 进行测试,这很糟糕。

有关更多信息,请阅读此重播: http: //grails.1312388.n4.nabble.com/grails-2-2-2-upgrade-from-2-2-0-breaks-mixin-on-controller-tp4645461p4645466.html,这通常适用于 Grails 中的 mixins,或者查看此问题的评论中报告的许多问题:http: //jira.grails.org/browse/GRAILS-8652(类在单元测试期间丢失了它们的 mixins)。

于 2013-06-14T07:20:06.810 回答
1

基于此线程中的答案, http: //grails.1312388.n4.nabble.com/Testing-a-controller-that-has-a-Mixin-td4645595.html

我最终使用,

void setup() {
    MyController.mixin(BaseController)
}
于 2014-06-30T21:35:01.813 回答