Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel 8单元测试-assertJson()如何在controller中捕获它_Php_Laravel_Unit Testing - Fatal编程技术网

Php Laravel 8单元测试-assertJson()如何在controller中捕获它

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(

我有一个laravel 8单元测试,如下所示:

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,因此我认为您的控制器中缺少逻辑