如何在Grails Integration测试中使用不同的数据创建多个请求

时间:2013-09-12 11:22:41

标签: testing grails integration spock

我正在使用Spock插件编写Grails 2.2.1集成测试,其中我试图将两组数据发布到同一个控制器端点:

when: "The user adds this product to the inventory"
def postData = [productId: 123]
controller.request.JSON = postData
controller.addToInventory()

and: "Then they add another"
def secondPostData = [productId: 456]
controller.request.JSON = secondPostData
controller.addToInventory()

then: "The size of the inventory should be 2"
new JSONObject( controller.response.contentAsString ).inventorySize == 2

我看到的问题是,对于两个请求,都将相同的JSON提交给addToInventory()。

This StackOverflow question建议调用controller.request.reset(),但这不起作用(没有方法签名:org.codehaus.groovy.grails.plugins.testing.GrailsMockHttpServletRequest.reset())。

我正在尝试的是什么?

3 个答案:

答案 0 :(得分:6)

“Where:”可用于在spock测试框架中执行数据驱动测试。请尝试使用以下示例:

when: "The user adds this product to the inventory"

controller.params.JSON = [productId:productId]
controller.addToInventory()

then: "The size of the inventory should be 2"
new JSONObject( controller.response.contentAsString ).inventorySize == 2

where:

ID|productId
1|123
2|456

希望有所帮助!!!

答案 1 :(得分:2)

实际上还有另一种方式。插入:

GrailsWebUtil.bindMockWebRequest()

在第二次测试开始时。这将有效地创建一个新的ServletContext,一个新的MockHttpServletRequest,一个新的MockHttpServletResponse,然后将所有三个绑定到当前线程中。

答案 2 :(得分:0)

虽然Anuj我们纠正了应该使用where子句来保持测试清洁,但有时候测试需要运行多个请求。在我的情况下,我想测试当它收到2个重复的POSTS,第二个被正确拒绝。

我发现重置响应符合我的要求:

controller.response.reset()

清除回复。