Grails - 使用JSON请求进行单元测试不起作用

时间:2014-06-04 10:44:48

标签: json grails testing

我有以下控制器代码:

@Transactional
def save(MyModel model) {
    model.save()
}

我正在使用以下方式对其进行测试:

request.json = new MyModel(property1: 1, property2: 2)
controller.save()

但是,每次运行测试时,我都会得到NullPointerException,因为model为空。我是否需要放置任何其他代码才能使绑定正常工作?

2 个答案:

答案 0 :(得分:7)

如果在控制器单元规范/测试中适当地模拟域对象,则将域对象设置为request.json应该有效。

相反,您还可以在测试中将JSON字符串设置为request.json,然后在调用控制器操作时绑定到MyModel。所以你的测试应该是这样的:

request.json = '{"property1": 1, "property2": 2}'

另请注意,由于请求有效负载中没有id,这表示您尝试POST新记录。在这种情况下,只有在请求中将http方法明确设置为POST时,与域对象的数据绑定才会起作用。

request.method = 'POST'

答案 1 :(得分:4)

为了让测试代码正常工作,我拨打了controller.request.json而不是request.json。另外,根据dmahapatro's answer,我将方法设置为POST

以下是工作代码的外观:

controller.request.method = 'POST'
controller.request.json = new MyModel(property1: 1, property2: 2)
controller.save()

更新

虽然控制器方法save不再获取空对象,但未设置JSON数据应设置的属性。

更新2

启动一个不同的项目并完成同样的事情之后,所有事情甚至都能将绑定属性绑定到方法参数。