我使用Laravel准备了一个示例API。它总是返回该对象:
{
"a": 1,
"b": 2
}
现在,我想更好地了解如何使用phpunit
对其进行测试。我发现有assertJson
和assertJsonFragment
方法,但我无法理解它们之间的区别。
比方说,我想断言响应的确切结构,因此它必须是a=1
和b=2
,仅此而已。一开始,我确定这会起作用:
$response = $this->get('/api/foo');
$response->assertStatus(200)
->assertJson(['a' => 1, 'b' => 2]);
它将通过测试,但是问题是,如果我向响应中添加更多属性(例如c=3
或其他内容),它仍然可以通过测试。然后是assertJsonFragment
方法,对于我的测试,它的行为相同,只是给出不同的错误消息。
assertJson
是越野车吗?还有什么其他方法可以用来做我想做的事情,那就是确保响应是这组特定的属性?
在Laravel 5.6和5.7上进行了测试。
答案 0 :(得分:3)
来自here:
assertJson
方法将响应转换为数组并利用PHPUnit::assertArraySubset
验证给定数组是否存在 在应用程序返回的JSON响应中。所以,如果有 JSON响应中的其他属性,此测试仍将通过 只要存在给定的片段。
更重要的是,实现您想要的目标:
如果您想验证给定的数组是否与应用程序返回的JSON完全匹配,则应使用
assertExactJson
方法