拉拉维尔 5.6。 PHP 单元。顺序不敏感的 assertJson() 方法

Posted

技术标签:

【中文标题】拉拉维尔 5.6。 PHP 单元。顺序不敏感的 assertJson() 方法【英文标题】:Laravel 5.6. PHPUnit. Order-insensitive assertJson() method 【发布时间】:2019-03-24 06:46:57 【问题描述】:

在我的业务逻辑中,我不关心元素的顺序。

这是我的测试示例

$this->getJson('/api/order-attempts')
     ->assertJson([
         'data' => [
             ['status' => 'error'],
             ['status' => 'error'],
             ['status' => 'confirmed'],
             ['status' => 'confirmed'],
             ['status' => 'confirmed'],
         ],
     ])->isOk();

只是因为订单不时失败。我不想对 api 进行排序,因为我不需要它。

是否有可能以某种方式assertJsonIgnoringOrder()

【问题讨论】:

也许 seeJson 适合你 assertJsonFragment 在内部进行排序(基本上忽略顺序),但它也匹配部分 JSON 片段,因此它可能适合您,也可能不适合您 【参考方案1】:

您可以使用assertSame()检查json的结构和对齐方式

例如试试这个

 $this->assertSame(json_encode([
     'data' => [
         ['status' => 'error'],
         ['status' => 'error'],
         ['status' => 'confirmed'],
         ['status' => 'confirmed'],
         ['status' => 'confirmed'],
     ]),$response->getContent(), '');

【讨论】:

【参考方案2】:

有各种各样的 JSON 断言,您可以从中构建您正在寻找的东西。

例如,您可以使用 assertJsonFragment() 断言部分 json 或仅断言结构是否正确,使用 assertJsonStructure() 忽略实际内容。

例如,您可以使用 assertJsonCount($number, $key) 查看 json 是否包含正确数量的元素,键为 status

不幸的是,没有特定的断言已经符合您的要求,至少默认情况下没有。可能有一些图书馆为您提供它。

【讨论】:

以上是关于拉拉维尔 5.6。 PHP 单元。顺序不敏感的 assertJson() 方法的主要内容,如果未能解决你的问题,请参考以下文章

拉拉维尔 5.6。如何测试 JSON/JSONb 列

Macroable.php 第 74 行中的 BadMethodCallException:方法保存不存在。拉拉维尔 5.2

方法保存不存在。拉拉维尔

PHP 如何将表单输入与数据库值进行比较 |拉拉维尔

拉拉维尔。 webpack.mix.php 是运行 Javascript 的唯一方法吗?

使用 switch 后无法使用分页。 - 拉拉维尔