首页 > 解决方案 > 使用 Laravel 测试 JSON 响应

问题描述

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

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

现在,我想更好地了解如何使用phpunit. 我发现有一些方法assertJsonassertJsonFragment但我无法理解它们之间的区别。

假设我想断言响应的确切结构,所以它必须是a=1and b=2,仅此而已,仅此而已。起初,我确信这会起作用:

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

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

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

assertJson越野车吗?有没有其他方法可以做我想做的事情,即确保响应是这组特定的属性?

在 Laravel 5.6 和 5.7 上测试。

标签: phpjsonlaravelphpunit

解决方案


这里

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

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

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


推荐阅读