【发布时间】:2019-10-15 10:08:31
【问题描述】:
我想为使用 Grails 框架编写的 Web 应用程序添加一些控制器单元测试。
我需要跳过控制器中cancel_request()方法中使用的getMessage()方法作为真实对象。
class PublicControllerSpec extends Specification implements ControllerUnitTest<PublicController> {
def "Cancel Request for user"() {
given:
controller.getMessage() << Spy(PublicController){
getMessage(_ as User, _ as String) >> "SuccessMessage"
}
when:
controller.cancel_request()
then:
response.redirectedUrl.contains('/public/list')
}
}
【问题讨论】:
-
你看到了什么错误?
-
@tim_yates getMessage() 不会被模拟,并以真实对象的形式给出结果
-
语法
controller.getMessage() << Spy(PublicController) { ... }看起来非常错误。请也显示控制器代码。我不使用 Grails,但从我在测试文档中看到的情况来看,它不会像这样工作。ControllerUnitTest是用于提供控制器实例的特征,因此没有明显的方法可以用模拟对象替换该实例,因为该特征的目标是对控制器进行单元测试,即您可以模拟/存根它的依赖项,而不是被测对象本身。 -
您所做的不是单元测试,而是集成测试。因此,您应该自己创建控制器(模拟)实例,在这种情况下不要使用
ControllerUnitTest特征。我认为你在这里误解了一些东西。 P.S.:类没有“功能”,它们有方法。 ;-) -
@kriegaex 我从你有用的教训中学到了。非常感谢!!
标签: grails groovy mocking spock