使用Laravel测试JSON响应

时间:2018-09-14 15:36:12

标签: php json laravel phpunit

我使用Laravel准备了一个示例API。它总是返回该对象:

{
    "a": 1,
    "b": 2
}

现在,我想更好地了解如何使用phpunit对其进行测试。我发现有assertJsonassertJsonFragment方法,但我无法理解它们之间的区别。

比方说,我想断言响应的确切结构,因此它必须是a=1b=2,仅此而已。一开始,我确定这会起作用:

$response = $this->get('/api/foo');

$response->assertStatus(200)
         ->assertJson(['a' => 1, 'b' => 2]);

它将通过测试,但是问题是,如果我向响应中添加更多属性(例如c=3或其他内容),它仍然可以通过测试。然后是assertJsonFragment方法,对于我的测试,它的行为相同,只是给出不同的错误消息。

assertJson是越野车吗?还有什么其他方法可以用来做我想做的事情,那就是确保响应是这组特定的属性?

在Laravel 5.6和5.7上进行了测试。

1 个答案:

答案 0 :(得分:3)

来自here

  

assertJson方法将响应转换为数组并利用   PHPUnit::assertArraySubset验证给定数组是否存在   在应用程序返回的JSON响应中。所以,如果有   JSON响应中的其他属性,此测试仍将通过   只要存在给定的片段。

更重要的是,实现您想要的目标:

  

如果您想验证给定的数组是否与应用程序返回的JSON完全匹配,则应使用assertExactJson方法