9

我正在使用 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() 。

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

我正在尝试的可能吗?

4

3 回答 3

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

希望有帮助!!!

于 2013-09-12T14:25:22.290 回答
3

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

GrailsWebUtil.bindMockWebRequest()

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

于 2015-05-22T01:29:58.023 回答
0

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

我发现重置响应可以满足我的需要:

controller.response.reset()

清除响应。

于 2016-10-06T17:43:22.570 回答