在空手道中,我希望有一个架构变量,它是响应数据的超集,以便我可以使用相同的架构测试多个请求。
这对于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中的任何键都应被忽略。
在空手道中是否有办法做到这一点,或者有计划继续增加此功能?
编辑:由于缺少的唯一属性是可为空的属性,因此更新了示例。
答案 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:)