拉拉维尔 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() 方法的主要内容,如果未能解决你的问题,请参考以下文章
Macroable.php 第 74 行中的 BadMethodCallException:方法保存不存在。拉拉维尔 5.2