Laravel 测试用例检查 JSON 输出中的一个元素
Laravel Test Case to check one element inside a JSON output
我的 Laravel
应用程序中有以下控制器:
class ProjectController extends Controller {
...
public function index() {
$projects = Project::where('is_completed', false)
->orderBy('created_at', 'desc')
->withCount(['tasks' => function ($query) {
$query->where('is_completed', false);
}])->get();
return response()->json($projects);
}
...
}
被以下路由引用:
Route::get('projects', 'ProjectController@index');
当我去 url: http://localhost:8000/api/projects
我得到:
[
{
"id": 2,
"name": "Project 02 Title",
"description": "Project 02 Description",
"is_completed": 0,
"created_at": "2018-10-13 16:23:28",
"updated_at": "2018-10-13 16:23:28",
"tasks_count": 0
},
{
"id": 1,
"name": "Project 01 Title",
"description": "Project 01 Description",
"is_completed": 0,
"created_at": "2018-10-13 16:22:52",
"updated_at": "2018-10-13 16:22:52",
"tasks_count": 0
}
]
此外,我有以下测试文件:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;
class ProjectTest extends TestCase
{
/**
* A basic test example.
*
* @return void
*/
public function testExample()
{
$response = $this->get('/');
// this is not working:
// $response->assertJson([ 0 => [ 'name' => 'Project 02 Title' ] ]);
}
}
?>
我想在 testExample()
上做的是检查输出数组(JSON
格式)第一个元素的 name
成员是否具有字符串值:Project 02 Title
.
知道如何实现吗?
谢谢!
再次检查您的测试,您没有访问正确的端点:
$response = $this->get('/');
那应该看起来更像这样:
$response = $this->get('/api/projects');
你的测试应该可以,看起来没问题。
如果您知道要查找的确切数组元素,则可以测试各个属性;例如:
$json = $reponse->json();
$this->assertSame('Project 02 Title', $json[0]['name']);
或者如果您想测试 JSON 结构,您可以使用:
$response->assertJsonFragment([
'name' => 'Project 02 Title'
]);
我的 Laravel
应用程序中有以下控制器:
class ProjectController extends Controller {
...
public function index() {
$projects = Project::where('is_completed', false)
->orderBy('created_at', 'desc')
->withCount(['tasks' => function ($query) {
$query->where('is_completed', false);
}])->get();
return response()->json($projects);
}
...
}
被以下路由引用:
Route::get('projects', 'ProjectController@index');
当我去 url: http://localhost:8000/api/projects
我得到:
[
{
"id": 2,
"name": "Project 02 Title",
"description": "Project 02 Description",
"is_completed": 0,
"created_at": "2018-10-13 16:23:28",
"updated_at": "2018-10-13 16:23:28",
"tasks_count": 0
},
{
"id": 1,
"name": "Project 01 Title",
"description": "Project 01 Description",
"is_completed": 0,
"created_at": "2018-10-13 16:22:52",
"updated_at": "2018-10-13 16:22:52",
"tasks_count": 0
}
]
此外,我有以下测试文件:
<?php
namespace Tests\Feature;
use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;
class ProjectTest extends TestCase
{
/**
* A basic test example.
*
* @return void
*/
public function testExample()
{
$response = $this->get('/');
// this is not working:
// $response->assertJson([ 0 => [ 'name' => 'Project 02 Title' ] ]);
}
}
?>
我想在 testExample()
上做的是检查输出数组(JSON
格式)第一个元素的 name
成员是否具有字符串值:Project 02 Title
.
知道如何实现吗?
谢谢!
再次检查您的测试,您没有访问正确的端点:
$response = $this->get('/');
那应该看起来更像这样:
$response = $this->get('/api/projects');
你的测试应该可以,看起来没问题。
如果您知道要查找的确切数组元素,则可以测试各个属性;例如:
$json = $reponse->json();
$this->assertSame('Project 02 Title', $json[0]['name']);
或者如果您想测试 JSON 结构,您可以使用:
$response->assertJsonFragment([
'name' => 'Project 02 Title'
]);