Grails 如何测试具有Basecontroller的@Mixin的控制器
我已经创建了一个BaseController,可以混入其他控制器 例如: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
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
中使用了GrailsMyController
(两个版本的@Mixin
)。有时候我觉得打得不好。将mixin更改为Groovywith format
一切都很顺利。我不喜欢那样。我必须坚持使用Grails@mixin
。显然,令人惊讶的是,执行@Mixin
grails清理和&grails编译
消除了这个问题。我能够正确地使用Grails@Mixin。我仍在关注这一差异
- 如果上述问题持续存在,我会考虑在单元测试的
方法中添加运行时mixinsetup()
- 在集成测试中,我使用了
而不是ControllerSpec
。在控制器的IntegrationSpec
中,注入和约定似乎得到了更好的维护。如果你看到了,我在int测试中没有实例化MyContollerControllerSpec
- 我还没有在普通Junit的单元和集成测试中测试过它,它们也应该很好
有关更多信息,请阅读此replay:,它通常适用于Grails中的混合,或者查看此问题评论中报告的许多问题:(类在单元测试期间丢失了它们的混合)。基于此线程中的答案 最后我用了
void setup() {
MyController.mixin(BaseController)
}
它没有:(我已经尝试了
@TestMixin
以及@Mixin
在spock测试中对MyController
进行了测试,我不确定在这种情况下是否可以使用TestFor
和TestMixin
。我将进行测试并让您知道。我已经在使用TestFor
,并且它不需要多个参数。)either@Anthony看到我的更新了吗n回答。@TestFor
仅用于一个参数;控制器、服务、域或简单类。请查看
void setup() {
MyController.mixin(BaseController)
}