我有以下问题 - 我想用Codeception
测试REST api。
当我想在JSON响应中确保我有数组:
'data' => [
'sth' => 'whathever'
]
我可以这样使用seeResponseJsonMatchesXpath
:
$I->seeResponseJsonMatchesXpath('//data/sth');
但是,如果我想确保我没有回应,该怎么办?我想用例如:
$I->seeResponseJsonMatchesXpath('//data');
$I->dontSeeResponseJsonMatchesXpath('//data/sth');
但很明显,Codeception中没有dontSeeResponseJsonMatchesXpath
方法。
我也不知道sth
中的确切值是什么,所以我可能无法在dontSeeResponseContainsJson
使用。
问题是 - 如何进行以下检查?
答案 0 :(得分:1)
(免责声明:完全不熟悉代码,只有XPath)
JSON is not supposed to be checked against XPath。但你可能做的检查是
$I->seeResponseJsonMatchesXpath('not(//data/sth)');
如果没有true
和1
,那么会返回data
或sth
,如果有,则返回false
或0
。< / p>
编辑:作为对您评论的回复:
这可能是我需要的东西,但我想确保只有数据不存在于数据内部而数据应该存在(但我不需要在此表达式中检查它)
表达已完全相同 - not(//data/sth)
会为
false
<data>
<sth/>
</data>
但仅对包含true
的文档返回data
:
<data/>
或其他任何东西。但在我看来,将JSON转换为XML可能存在陷阱。
我检查了两个解决方案 - 你的和//数据/不是(某事)但它似乎无法正常工作
是的,这不起作用,因为您使用的是XPath 1.0引擎。您的尝试将是一个有效的XPath 2.0表达式。使用以下表达式独立测试data
和sth
:
//data and not(//data/sth)
如果至少存在一个true
元素,并且没有data
元素作为子元素,那么这只返回data
。