如何验证空手道中 JSON 模式内的对象是否为空或包含一系列键:值对?

问题描述 投票:0回答:2

我正在尝试使用空手道验证这两种状态的 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
对象内有多个键:值对,并且我想确保当它不为空时所有这些键都存在于其中,我无法通过这种方法检查它,因为对于每个人键:值对,此方法假设它们可能存在或不存在,并且即使其中某些键存在,也会匹配架构。

karate
2个回答
1
投票

哇,我不得不承认我从来没有遇到过这个案例,这说明了一些问题。我终于找到了一个可能的解决方案:

* 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

0
投票

我也遇到过类似的情况,但用的是

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
© www.soinside.com 2019 - 2024. All rights reserved.