模式中是否包含测试响应的方法?

时间:2019-05-18 12:32:55

标签: karate

在空手道中,我希望有一个架构变量,它是响应数据的超集,以便我可以使用相同的架构测试多个请求。

这对于GraphQL特别有用,在GraphQL中,请求本身定义了返回的字段。

预期的方案:

{
   id: '#notnull',
   name: '#notnull',
   description: '##string',
   nonNullStringField: '#string'
   ...
}
Given url ...
When request ...
Then match response.data <contained in> '#(mySchema)'

响应数据:

{
   id: 'someId',
   name: 'some name'
}

在这种情况下,response.data返回的所有键都应在架构中,但是架构中不在response.data中的任何键都应被忽略。

在空手道中是否有办法做到这一点,或者有计划继续增加此功能?

编辑:由于缺少的唯一属性是可为空的属性,因此更新了示例。

1 个答案:

答案 0 :(得分:1)

我不认为需要增强功能,因为可选标记##foo是为此目的而设计的,并且已经可以使用:

* def schema = { id: '#notnull', name: '#notnull', description: '##string' }
* def response = { id: 'someId', name: 'some name' }
* match response == schema

编辑:但是由于您希望以“通用”方式将架构限制为响应中的键,因此可以这样做:

* def expected = {}
* def fun = function(k, v){ expected.put(k, schema[k]) }
* eval karate.forEach(response, fun)
* match response == expected

您应该能够轻松创建实现上述目标的可重用JS或Java实用程序。我不赞成添加另一个语法/ match关键字的一些原因是,嵌套JSON可能会有一些有趣的边缘情况,这会使情况变得复杂。而且我不想进一步复杂化match。正如我在评论中所说,IMO模式验证是您在GraphQL中需要测试的最后一件事,几乎可以保证。这是两年来第一次有人提出这个要求,所以就是这样。您可以考虑当然提交PR:)