【问题标题】:Codeception - how to check response doesn't match xpathCodeception - 如何检查响应与 xpath 不匹配
【发布时间】:2015-01-15 08:50:53
【问题描述】:

我有以下问题 - 我想用 Codeception 测试 REST api。

当我想确保在 JSON 响应中我有数组时:

'data' => [
   'sth' => 'whathever'
]

我可以这样使用seeResponseJsonMatchesXpath

$I->seeResponseJsonMatchesXpath('//data/sth');

但是如果我想确保我没有回应某事该怎么办?我想使用例如:

$I->seeResponseJsonMatchesXpath('//data');
$I->dontSeeResponseJsonMatchesXpath('//data/sth');

但显然 Codeception 中没有 dontSeeResponseJsonMatchesXpath 方法。

我也不知道sth 的确切值是多少,所以我可能无法在这里使用dontSeeResponseContainsJson

问题是 - 如何进行以下检查?

【问题讨论】:

    标签: rest testing xpath codeception


    【解决方案1】:

    (免责声明:完全不熟悉代码接收,仅使用 XPath)

    JSON is not supposed to be checked against XPath。但是你可能会做的检查是

    $I->seeResponseJsonMatchesXpath('not(//data/sth)');
    

    如果没有datasth,则返回true1 - 如果有,则返回false0


    编辑:作为对您的 cmets 的回应:

    这可能是我需要的接近的东西,但我想确保只有某物不存在于数据中,而数据应该存在(但我不需要在这个表达式中检查它)

    表达式已经做到了 - not(//data/sth) 为类似的文档返回 false

    <data>
      <sth/>
    </data>
    

    但对于仅包含 data 的文档返回 true

    <data/>
    

    或其他任何东西。但在我看来,将 JSON 转换为 XML 可能存在缺陷。


    我检查了两个解决方案 - 你的和 //data/not(sth) 但它似乎不起作用

    是的,这不起作用,因为您使用的是 XPath 1.0 引擎。您的尝试将是一个有效的 XPath 2.0 表达式。使用以下表达式独立测试datasth

    //data and not(//data/sth)
    

    仅当至少存在一个 data 元素并且不存在将 sth 元素作为子元素的 data 元素时,才会返回 true

    【讨论】:

    • 我看到了这个警告,但效果很好。可能这是我需要的东西,但我想确保只有sth 不存在于data 中,而数据应该存在(但我不需要在这个表达式中检查它)。我检查了两种解决方案 - 你的和 //data/not(sth) 的,但它似乎不起作用
    猜你喜欢
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多