Karate 有没有办法测试模式中包含的响应?

Karate 有没有办法测试模式中包含的响应?,karate,Karate,在空手道中,我希望有一个模式变量,它是响应数据的超集,这样我就可以用相同的模式测试多个请求 这对于GraphQL特别有用,因为请求本身定义了返回的字段 预期架构: { id: '#notnull', name: '#notnull', description: '##string', nonNullStringField: '#string' ... } 在这种情况下,response.data返回的所有键都应该在架构中,但是架构中不在response.data中

在空手道中,我希望有一个模式变量,它是响应数据的超集,这样我就可以用相同的模式测试多个请求

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

预期架构:

{
   id: '#notnull',
   name: '#notnull',
   description: '##string',
   nonNullStringField: '#string'
   ...
}
在这种情况下,response.data返回的所有键都应该在架构中,但是架构中不在response.data中的任何键都应该被忽略

在空手道中有没有办法做到这一点,或者有没有计划在将来增加这一功能


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

我不认为需要增强,因为可选标记
##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:

这是我目前正在考虑的解决方案,但是问题是,对于GraphQL来说,任何字段都可能丢失,然后测试(数据库级)所需的字段将不起作用,我相信,在GraphQL,实际上不需要字段(请求级别)。我可以请求一个没有id或名称的描述列表(生成的JSON不应该有任何这些字段)。但是在我请求(数据库等价于)#notnull字段的情况下,它们永远不应该为null。我尝试过这样做:``*def idSchema='#string'*def schema={id:'##(field)}``但是如果字段为空或者字段不存在,测试都会通过(这是一种只有在不存在时才应该通过的情况)。@CarlosRosa我放弃了,我无法理解你,我的编辑如何没有解决你需要的问题。通过严格遵循这个过程,您可以自由地请求PR,这是最好的:此外,这可以通过更改代码来实现(做一个forEach键作为响应,在测试之前添加模式),但是选择空手道并请求“包含在”正是这样,每次测试都不需要手动完成。感谢您的支持。您关于GraphQL的陈述是有道理的,尽管在第一步中使用空手道不是我的决定,但实际上我对该框架印象深刻,并且希望继续使用它,即使某些测试需要以不同的方式进行。
* 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