gpt4 book ai didi

php - 影响数据库的 Laravel 测试用例 - 使用最佳实践

转载 作者:行者123 更新时间:2023-11-29 16:51:22 26 4
gpt4 key购买 nike

我的 Laravel 应用程序上有以下 Controller :

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);
}
public function store(Request $request) {
$validatedData = $request->validate([
'name' => 'required',
'description' => 'required',
]);
$project = Project::create([
'name' => $validatedData['name'],
'description' => $validatedData['description'],
]);
return response()->json('Project created!');
}
...
}

由以下路由引用:

Route::get('projects', 'ProjectController@index');
Route::post('projects', 'ProjectController@store');

另外,我有以下测试文件:

<?php

namespace Tests\Feature;

use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;

class ProjectTest extends TestCase
{
public function testCreateProjects()
{
$response = $this->post(
'/api/projects',
[
'name' => 'Project 01 Title',
'description' => 'Project 01 Description',
]
);
$response = $this->post(
'/api/projects',
[
'name' => 'Project 02 Title',
'description' => 'Project 02 Description',
]
);

$response = $this->get('/api/projects');
$data = $response->json();

$this->assertSame(2, count($data));
}
}

作为实时数据库,我使用:MySQL。这是必须的。

在文件:/.env.testing 上,我指定了一个测试 MySQL 数据库,因此我不会对实时数据库进行更改。

有几个像下面这样的文件:

/database/migrations/<TIMESTAMP>_create_projects_table.php

在运行以下一些命令时创建所需的表:

$ php artisan:migrate
$ php artisan:migrate --env=testing

我使用以下命令运行测试用例:

$ phpunit

只有当测试数据库为空时,上面的测试用例才能正常工作。

然后我想知道这里运行测试用例的最佳实践是什么?例如,也许:

  • 在运行测试用例之前清理每个表?
  • 使用另一种数据库,可能是on-the-fly数据库、SQLite等(但请记住,实时数据库需要 >MySQL)。

对此有什么想法吗?我正在寻找最佳实践。

谢谢!

最佳答案

您可以在内存中使用SQLite。另一个不错的选择是使用数据库事务,您可以在每次测试后回滚查询。 Laravel 提供了方便的 DatabaseTransactions 测试特征。

关于php - 影响数据库的 Laravel 测试用例 - 使用最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52799267/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com