Php Laravel 8单元测试-assertJson()如何在controller中捕获它
我有一个laravel 8单元测试,如下所示:Php Laravel 8单元测试-assertJson()如何在controller中捕获它,php,laravel,unit-testing,Php,Laravel,Unit Testing,我有一个laravel 8单元测试,如下所示: public function testAddingTwoCars() { $response = $this->postJson('api/basket', ['cars' => [['name' => 'car one'], ['name' => 'car two']]]); $response ->assertStatus(200) ->assertJson(
public function testAddingTwoCars()
{
$response = $this->postJson('api/basket', ['cars' => [['name' => 'car one'], ['name' => 'car two']]]);
$response
->assertStatus(200)
->assertJson(['total' => 40]);
}
在我的路线中,我有:
Route::post('/api/basket',[basketController::class, 'store']);
在我的控制器中,我有:
public function store(Request $request)
{
$data = $request->all();
return response()->json($data);
}
当我使用php artisan test
运行测试时,它显示:
• Tests\Unit\BasketTest > adding two cars
Unable to find JSON:
[{
"total": 40
}]
within response JSON:
[{
"cars": [
{
"name": "car one"
},
{
"name": "car two"
}
]
}].
如何:获取总数,因为它不在$request
中,因此我可以在控制器中执行类似操作:
$public function store(Request $request)
{
$data = $request->all();
$data['total'] = 40;
return response()->json($data);
}
上面的方法很有效,但它是硬编码的,因此不是最好的方法 断言响应包含给定的JSON数据:
$response->assertJson(array $data, $strict = false);
方法将响应转换为数组,并利用PHPUnit::assertArraySubset
验证给定数组是否存在于应用程序返回的JSON响应中。因此,如果JSON响应中有其他属性,那么只要给定片段存在,该测试仍将通过
你可以在这个链接上阅读
这里呢
你也可以查看这个视频
->assertJson(['total'=>40])
是无意义的;除非JSON具有此功能,否则不会通过:
return response()->json(['data' => $data, 'total' => 40]);
“total”键从何而来?我不确定,这就是我在单元测试中要做的全部工作,它只是说$response->assertStatus(200)->assertJson(['total'=>40])@Tziebarayour controller方法最多不提供$data变量的“total”键,它将包含“cars”json,因此我认为您的控制器中缺少逻辑