如何使用模式在空手道中验证多个可能的值

时间:2019-12-12 14:48:30

标签: enums swagger karate

我目前正在使用Swagger模式,该模式为多个值定义枚举。我想知道如何对我的草率文件做出回应。我想确保返回的响应值只是模式中指定的值之一(想想Swagger中的枚举)。如果响应中返回的任何其他内容(在架构内的数组中未定义)都将失败。

如何使用以下方法实现此目标:

Schema.json

{
    "itemType":{
        "hardware":[
            "VIDEO CARD",
            "SOLID STATE DRIVE",
            "HARD DRIVE"
        ] 
    }
}

所有值都是可选的,并将以字符串值作为响应。

响应:

{
    "itemType": {
        "hardware": "HARD DRIVE"
    }
}

我的猜测是它可能与* match response.itemType.hardware == "##string? _ == 'VIDEO CARD' || _ == 'SOLID STATE DRIVE' || _ == 'HARD DRIVE'"相似,但是我的语法可能不正确。

3 个答案:

答案 0 :(得分:2)

您可以尝试以下方法:

diff_list = diff.split("\n")
first_serotype_line_nbr = 0

for n,line in enumerate(diff_list):
    if "predicted_serotype" in line:
        if first_serotype_line_nbr == 0:
            first_serotype_line_nbr = n
        else:
            diff_list[first_serotype_line_nbr] += line.rstrip()
            del(diff_list[n])
    else:    
        diff_list[n]=line.rstrip()

print("\n".join(diff_list))

答案 1 :(得分:1)

我觉得这更具可读性:

      * match schema.itemType.hardware contains response.itemType.hardware

右侧有response可能有点不寻常。

答案 2 :(得分:1)

另一种验证方式是使用匹配器。使用 JSON 路径,您可以获取元素中的所有内容,并借助 comparison operators 的帮助,例如 contains仅包含!contains 检查字符串列表中是否存在某些元素。例如,在您的情况下:

Scenario:
  Given path '/something'
  When method GET
  Then status 200
  And print response
  And match response.itemType.hardware[*] contains only ["value1", "value2"]

以这种方式更清楚地编写您的测试。更具可读性。

<块引用>

注意:考虑到 contains 运算符仅适用于列表,因此您需要获取列表。在前面的例子中,我们使用 * 符号来做到这一点。