【发布时间】:2016-09-13 16:37:17
【问题描述】:
我有一个私有控制器方法,多个操作使用该方法从数据库中检索对象。我无法终生正确地模拟/存根对数据库的调用。控制器方法是:
private Order getSalesOrder(){
def order = Order.get(params.id)
if(!order){
flash.message = (code: 'default.not.found.message', args: [message(code: 'order.label', default: 'Order'), params.id])
redirect action: "list"
return
}
return order
}
我此时的测试方法是:
def "test getSalesOrder returns Sales Order"(){
given:
params.id >> 3002L
criteriaSetup()
Order testOrder = salesOrders[2]
Order.metaClass.static.get() >> testOrder
when:
def order = controller.getSalesOrder()
then:
1 * Order.get(3002) >> testOrder
//1 * Order.get() >> salesOrders[2]
order == testOrder
}
我的结果要么是关于调用太少的消息,要么我只是返回一个空值。两者都会导致测试失败。
我通过使用从各种博客或教程中找到的示例尝试了这种变化,例如:
Order.metaClass.static.get() >> testOrder
Order.metaClass.methods.get = { return testOrder }
1 * Order.get(3002) >> testOrder
1 * Order.get(params.id) >> testOrder
我不知道从哪里开始,因为我是 spock 测试、Mocking 和 Stubing 的新手。而且由于我们正在为遗留代码编写测试,这更加令人困惑。
【问题讨论】:
-
我不确定您的问题到底是什么。如果您正在寻找 Mocking 和 Stubbing 的解释,那么 Spock 文档是一个很好的起点。检查spockframework.org/spock/docs/1.1-rc-2/…
-
我的问题是我想看到,当我调用 MyDomain.get() 时,它会从数据库返回一个 MyDomain 对象以呈现我的视图或执行操作。当我以不同的方式运行测试时,我尝试模拟或存根该功能/交互,我得到一个空值,因此我无法让我的测试通过。我需要知道模拟或存根这种交互的正确方法,因为 Spock 文档和/或教程似乎没有解决这种类型的交互
标签: unit-testing grails-orm grails-2.0 spock