使用Laravel测试JSON响应

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Laravel测试JSON响应相关的知识,希望对你有一定的参考价值。

我用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上测试过。

答案

来自here

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

更重要的是,实现你想要的:

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

以上是关于使用Laravel测试JSON响应的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 尝试对 API JSON 响应进行单元测试

Laravel 控制器返回索引视图而不是 json 响应

Laravel 5.1 使用 JSON 的 API 的 PHPUnit 测试

localhost上的测试Laravel API无法获得响应

如何从片段中的 JSON 响应中的对象获取数据

Laravel 功能测试响应原始属性