Karate框架:如何在match contains响应中检查条件OR
解决match contains中字段同时支持字符串和null的Schema验证问题
我看你现在在用match contains做响应Schema和数据类型验证,碰到了firstName、mI这类字段时而返回null、时而返回字符串的情况,之前写的断言没通过对吧?
你之前的代码大概是这样的:
match each $response.data.Results contains """ { "providerID": '#number', "firstName": "#? _ == '#string' || _ == '#null'", "lastName": '#string', "mI": "#? _ == '#string' || _ == '#null'", "title": '#str...
问题出在你用#?表达式的时候,错误地把#string和#null当作具体字符串值来比较了,但实际上它们是类型断言符号,不是实际值,这样的逻辑自然会导致断言失败。
给你两个可行的解决办法:
方法一:用#anyOf直接指定允许的类型
这是最简洁直观的方式,直接声明字段可以匹配任意指定的类型:
match each $response.data.Results contains """ { "providerID": '#number', "firstName": "#anyOf('#string', '#null')", "lastName": '#string', "mI": "#anyOf('#string', '#null')", "title": '#string' } """
#anyOf会自动校验字段是否符合其中任意一个类型规则,完美适配你的场景。
方法二:修正#?的自定义判断逻辑
如果你偏好使用#?写自定义校验逻辑,需要用类型判断函数来检查字段类型,而不是直接和'#string'这类符号比较:
match each $response.data.Results contains """ { "providerID": '#number', "firstName": "#? typeof(_) == 'string' || _ == null", "lastName": '#string', "mI": "#? typeof(_) == 'string' || _ == null", "title": '#string' } """
这里typeof(_)会返回字段的实际类型字符串,_ == null直接判断字段是否为null,逻辑完全符合你的需求。
你可以试试这两种方法,应该就能解决断言失败的问题了。
内容的提问来源于stack exchange,提问作者Jo-Anne
相关产品推荐
相关产品推荐

