当前位置: 首页 > 知识库问答 >
问题:

空手道-条件验证Json模式

闾丘照
2023-03-14

我试图为下面的响应编写JSON模式。响应是动态的它可以是细节或组织细节。如果响应中的CusterType,那么响应将包含人对象(组织对象将不可用)。如果CusterTypeorg,组织详细信息将包含在响应中(人对象将不可用)。下面给出了两种不同的预期反应

{
    "customerType" : "person",
    "person" : {
        "fistName" : "A",
        "lastName" : "B"
    },
    "id" : 1,
    "requestDate" : "2021-11-11"
}
{
    "customerType" : "org",
    "organization" : {
        "orgName" : "A",
        "orgAddress" : "B"
    },
    "id" : 2,
    "requestDate" : "2021-11-11"
}

我试图使用下面给出的模式使上述条件有效

{
    "customerType" : "#string",
    "organization" : "#? karate.match(response.customerType, 'org').pass ? karate.match(_, organizationSchema).pass : true)",
    "person" : "#? karate.match(response.customerType, 'person').pass ? karate.match(_, personSchema).pass : true"),
    "id" : "#number",
    "requestDate" : "#string"
}

我目前面临的问题是,如果响应中的customerTypeperson,它会抛出以下错误

all key-values did not match, expected has un-matched keys: [organization]

是否有任何方法可以在模式中指定,如果person对象可用,则organization对象将不可用,反之亦然

共有1个答案

尹辰沛
2023-03-14

如果你坚持在一个“单一”的模式中做这件事,那么空手道就不是你的工具。否则,请继续阅读。

空手道鼓励重用图式“块”。这里有两种可能的解决方案来满足您的需求。我希望你做更多的阅读,你可以嵌入JS在空手道脚本,操纵JSON之前做一个匹配,甚至有方法合并JSON使用karate.merge(),如果你真的很喜欢。您不需要总是做"精确"匹配,有时包含可以很好地完成工作。

* def personSchema = { firstName: '#string', lastName: '#string' }
* def orgSchema = { orgName: '#string', orgAddress: '#string' }
* def schema = { customerType: '#string', id: '#number' }

* def response1 = { customerType: 'person', person: { firstName: 'Foo', lastName: 'Bar' }, id: 1 }
* match response1 contains schema
* def extra = response1.person ? { person: '#(personSchema)' } : { organization: '#(orgSchema)' }
* match response1 contains extra

* def response2 = { customerType: 'org', organization: { orgName: 'Foo', orgAddress: 'Bar' }, id: 2 }
* if (response2.person) schema.person = personSchema; else schema.organization = orgSchema
* match response2 == schema

尽管如此,我强烈反对这种“聪明”的测试,它只会导致可维护性问题。请尽可能地坚持简单的场景,并设置您的测试/请求,以便您100%知道响应将是什么。请花点时间阅读以下内容:https://stackoverflow.com/a/50350442/143475

 类似资料:
  • 我只是想知道如何进行条件模式验证。API响应是基于键的动态响应。如果是,那么,人的详细信息将被包括,如果是组织的详细信息将被包括在JSON响应中。所以响应可以是以下任何一种形式 我为验证上述2个场景而创建的架构如下 但是架构与实际响应不匹配。我应该对架构进行哪些更改才能使其工作?

  • 我一直在用这种东西。 预期的反应有两种可能的结果,我想断言,如果我们得到其中任何一种,测试应该通过。 第一 第二 如果我们在响应中得到它们中的任何一个,测试/模式应该通过。如何在同一个模式中断言这两个场景?任何帮助都非常感谢。谢谢!

  • 早上好 我刚刚开始使用JSON,所以我知道这是一个非常基本的问题,有人能指出我在尝试验证下面的事件和问题ID方面的错误吗? id字段似乎已成功验证,但我的文件在尝试验证时失败。

  • 我正在使用空手道验证GET请求的整个json响应。 下面是来自请求的json响应示例(我只为items显示了两个元素) 以下是我试图验证的方式: 但是,我得到了一个断言错误:

  • 我一直在验证下面的回答。 当我使用空手道发出获取请求时,我会得到以下响应,我想验证它。 我试过: 它说它不是字符串。你能帮我确认一下这个请求吗?

  • 我试图用空手道验证响应模式,但数组存在问题。附加响应和功能以及my schema.json。 回应- } responseSchema.json {"页面":"#编号","per_page":"#编号","总计":"#编号","total_pages":"#编号","数据": "#[] #对象","支持":"#对象"}