pact:如何检查响应中可能存在或不存在的字段
pact: how to check a a field in the response that may or may not exist
我有一个服务可以用 json blob 响应请求,例如:
{
"field1": 1,
"field2": "2",
"array": [1,2,3]
}
我知道我可以使用 EachLike
测试 array
,像这样:
expected = {
"field1": Like(1),
"field2": Like("2"),
"array": EachLike(1)
}
问题是 "array" 是响应中的可选字段。它可能根本不存在,如果不存在,我仍然需要合同来验证。如何定义响应正文中的字段必须匹配类型(如果存在),但它可能根本不存在?
为什么不支持指定可选属性?
首先,假设您在进行验证测试时可以控制提供者的数据(和消费者的数据)。如果您不这样做,那么 Pact 可能不是适合您情况的最佳工具。
其次,如果您考虑一下,如果 Pact 支持断言元素 $.body.name 可能出现在响应中,那么您编写的消费者代码可以处理可选的 $.body.name,但实际上,提供者给出了 $.body.firstname,没有任何测试会告诉您您做出了错误的假设。请记住,提供者可以 return 额外数据而不会使合同失败,但它必须至少提供您期望的数据。
我建议您在需要填充数组的地方编写一个交互,这样您就知道如何处理填充的数组。然后把它完全排除在其他交互之外,然后它是否被填充就无所谓了。
我有一个服务可以用 json blob 响应请求,例如:
{
"field1": 1,
"field2": "2",
"array": [1,2,3]
}
我知道我可以使用 EachLike
测试 array
,像这样:
expected = {
"field1": Like(1),
"field2": Like("2"),
"array": EachLike(1)
}
问题是 "array" 是响应中的可选字段。它可能根本不存在,如果不存在,我仍然需要合同来验证。如何定义响应正文中的字段必须匹配类型(如果存在),但它可能根本不存在?
为什么不支持指定可选属性?
首先,假设您在进行验证测试时可以控制提供者的数据(和消费者的数据)。如果您不这样做,那么 Pact 可能不是适合您情况的最佳工具。
其次,如果您考虑一下,如果 Pact 支持断言元素 $.body.name 可能出现在响应中,那么您编写的消费者代码可以处理可选的 $.body.name,但实际上,提供者给出了 $.body.firstname,没有任何测试会告诉您您做出了错误的假设。请记住,提供者可以 return 额外数据而不会使合同失败,但它必须至少提供您期望的数据。
我建议您在需要填充数组的地方编写一个交互,这样您就知道如何处理填充的数组。然后把它完全排除在其他交互之外,然后它是否被填充就无所谓了。