当被测方法包含闭包时进行 Spock 测试
Spock Testing when method under test contains closure
我正在使用 grails 插件 multi-tenant-single-db。在这种情况下,我需要编写一个 spock 测试,在其中我们暂时删除租户限制。位置是我的租户,所以我的方法是这样的:
def loadOjectDetails(){
Location.withoutTenantRestriction{
// code here to retrieve specific items to the object to be loaded
render( template: "_loadDetails", model:[ ... ]
}
}
该方法按预期运行,但试图将方法置于测试范围内时,错误输出表明:
groovy.lang.MissingMethodException: No signature of method: com.myPackage.myController.Location.withoutTenantRestriction() is applicable for argument types:
以及由此而来的堆栈跟踪。
我需要存根吗? withoutTenantRestriction 是我整个方法逻辑的包装器。
更新:
测试代码如下所示:
given:
params.id = 3002
currentUser = Mock(User)
criteriaSetup()
controller.getSalesOrder >> salesOrders[2]
when:
controller.loadOrderManageDetails()
then:
(1.._) controller.springSecurityService.getCurrentUser() >> currentUser
expect:
view == 'orderMange/orderManageDetail'
model.orderInstance == salesOrders[2]
是的!您应该按照在 运行 时间而不是编译时间创建的方式对它进行存根。
你可以像下面这样存根:
Your_Domain.metaClass.withoutTenantRestriction{Closure closure ->
closure.call()
}
这样您的常规代码就可以在测试用例中运行。此外,在 withoutTenantRestriction
中,它基本上启动了一个新的休眠会话,这并不重要,因为现在您已经关闭了闭包,您可以执行所需的操作来代替仅调用 closure.call()
。
此外,同样适用于 withThisTenant
。
在集成测试中,您不需要像加载整个环境那样对其进行存根。
希望对您有所帮助!!
我正在使用 grails 插件 multi-tenant-single-db。在这种情况下,我需要编写一个 spock 测试,在其中我们暂时删除租户限制。位置是我的租户,所以我的方法是这样的:
def loadOjectDetails(){
Location.withoutTenantRestriction{
// code here to retrieve specific items to the object to be loaded
render( template: "_loadDetails", model:[ ... ]
}
}
该方法按预期运行,但试图将方法置于测试范围内时,错误输出表明:
groovy.lang.MissingMethodException: No signature of method: com.myPackage.myController.Location.withoutTenantRestriction() is applicable for argument types:
以及由此而来的堆栈跟踪。
我需要存根吗? withoutTenantRestriction 是我整个方法逻辑的包装器。
更新: 测试代码如下所示:
given:
params.id = 3002
currentUser = Mock(User)
criteriaSetup()
controller.getSalesOrder >> salesOrders[2]
when:
controller.loadOrderManageDetails()
then:
(1.._) controller.springSecurityService.getCurrentUser() >> currentUser
expect:
view == 'orderMange/orderManageDetail'
model.orderInstance == salesOrders[2]
是的!您应该按照在 运行 时间而不是编译时间创建的方式对它进行存根。 你可以像下面这样存根:
Your_Domain.metaClass.withoutTenantRestriction{Closure closure ->
closure.call()
}
这样您的常规代码就可以在测试用例中运行。此外,在 withoutTenantRestriction
中,它基本上启动了一个新的休眠会话,这并不重要,因为现在您已经关闭了闭包,您可以执行所需的操作来代替仅调用 closure.call()
。
此外,同样适用于 withThisTenant
。
在集成测试中,您不需要像加载整个环境那样对其进行存根。
希望对您有所帮助!!