我正在尝试使用空手道验证这两种状态的 API 响应。 场景 1(当它返回包含费用密钥的
contractData
对象时):
{
"customer": {
"financialData": {
"totalAmount": 55736.51,
"CreateDate": "2022-04-01",
"RequestedBy": "[email protected]"
},
"contractData": {
"Fee": 78.00
}
}
}
场景2(当它返回空的
contractData
对象时):
{
"customer": {
"financialData": {
"totalAmount": 55736.51,
"CreateDate": "2022-04-01",
"RequestedBy": "[email protected]"
},
"contractData": {}
}
}
如何编写模式验证逻辑来验证这两种状态? 我能做的最好的事情就是这样写:
* def schema = {"customer":{"financialData":{"totalAmount":"#number","CreateDate":"#?isValidDate(_)","RequestedBy":"#string"},"contractData":{"Fee": ##number}}}
* match response == schema
它似乎适用于上述两种情况,但我不确定这是否是最好的方法。这种方法的问题是,如果我在
contractData
对象内有多个键:值对,并且我想确保当它不为空时所有这些键都存在于其中,我无法通过这种方法检查它,因为对于每个人键:值对,此方法假设它们可能存在或不存在,并且即使其中某些键存在,也会匹配架构。
哇,我不得不承认我从来没有遇到过这个案例,这说明了一些问题。我终于找到了一个可能的解决方案:
* def chunk = { foo: 'bar' }
* def valid = function(x){ return karate.match(x, {}).pass || karate.match(x, chunk).pass }
* def schema = { hey: '#? valid(_)' }
* def response1 = { hey: { foo: 'bar' } }
* def response2 = { hey: { } }
* match response1 == schema
* match response2 == schema
我也遇到过类似的情况,但用的是
null
而不是empty
。
这是我针对您的问题的解决方案:
* def expected =
"""
{
"customer": {
"financialData": {
"totalAmount": 55736.51,
"CreateDate": "2022-04-01",
"RequestedBy": "[email protected]"
},
"contractData": "#object"
}
}
"""
* def contractDataExpected = "contractData": {"Fee": "#number"}
* def isContractDataNullOrObject = (response.contractData == null) || (typeof response.contractData == 'contractDataExpected')
* match isContractDataNullOrObject == true