Karate 空手道框架:#notnull和#present在响应为空时不起作用

Karate 空手道框架:#notnull和#present在响应为空时不起作用,karate,Karate,我的验证是验证orgId是否出现在响应中,并且orgId应该包含一些值 我得到的回应是 状态代码200,响应正文为空 现在我有下面的实现 Then match $.orgId == '#present' Then match $.orgId == '#notnull' 在这种情况下,代码通过,理想情况下应该失败,因为响应主体为空,并且响应中不存在orgId。 我的问题是,为什么代码会通过#present和#notnull,即使响应主体是空的您肯定遗漏了什么。在一个全新的场景中尝试一下,看看它是

我的验证是验证orgId是否出现在响应中,并且orgId应该包含一些值

我得到的回应是 状态代码200,响应正文为空

现在我有下面的实现

Then match $.orgId == '#present'
Then match $.orgId == '#notnull'
在这种情况下,代码通过,理想情况下应该失败,因为响应主体为空,并且响应中不存在orgId。
我的问题是,为什么代码会通过
#present
#notnull
,即使响应主体是空的

您肯定遗漏了什么。在一个全新的场景中尝试一下,看看它是否有效。下面是硬编码
response
,这与运行时发生的情况完全相同,顺便说一下,这是一种针对不同类型的JSON测试断言的好方法(无需进行任何HTTP调用):

正如您所料,这会导致失败:

assertion failed: path: $.orgId, actual: null, expected: '#present', reason: actual json-path does not exist
因此,如果您仍然被卡住,请遵循以下流程:

编辑:如果您的响应是空字符串,但您希望使用JSON,那么只需执行此操作,测试就会失败,请参阅类型转换:

但正如文档中所提到的,您应该始终尝试匹配“完整JSON”,这样应该可以:

* def response = ''
Then match $ contains { orgId: '#notnull' }

编辑:这将在0.9.4中得到修复,我所说的场景几乎没有什么不同。响应不是{}响应实际上是空的*def response=''然后匹配$.orgId='.#present'然后匹配$.orgId='.#notnull'这不会给出失败,理想情况下应该是这样的fail@ArchitGoel你的问题一点也不清楚。无论如何,请看我的编辑。我看到了您的编辑并添加了如下内容*def response='*json response=response然后匹配$.orgId=''#present'然后匹配$.orgId=''.\notnull'这是因为无法转换为json字符串而失败的。这只是一个解决方法,我的问题是为什么它会失败,说不能转换为json字符串。理想情况下,它应该通过说orgId不存在或诸如此类的话来失败#notnull或#present在本例中甚至未执行case@ArchitGoel-有问题吗?
* json response = response
* def response = ''
Then match $ contains { orgId: '#notnull' }