我尝试使用Laravel 5.4 + PHPUnit来测试我的课程。我创建了以下类来测试用户控制器:
<?php
namespace Tests\Feature;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Tests\TestCase;
class UserControllerTest extends TestCase
{
protected $baseUrl = 'http://localhost/pmv2';
use DatabaseMigrations;
public function testCreatesUser()
{
echo "\nTest: POST /users => Create new user";
$data = [
'first_name' => 'first_new_user',
'last_name' => 'last_new_user',
'email' => 'email_new@pm.com',
'password' => 'new_password',
'phone_number' => '3333333333',
'status' => 'active',
'created_at' => '2000-1-1 10:10:00',
'updated_at' => '2000-1-1 10:10:00',
];
$response = $this->post('/users', $data);
$response->assertStatus(200);
$this->assertDatabaseHas('users', ['email' => $data['email']]);
}
public function testReadAllUsers()
{
$this->seed('UsersTableSeeder');
echo "\nTest: GET /users => Read all users";
$this->seed('UsersTableSeeder');
$response = $this->get('/users');
$response->assertStatus(200);
$response->assertJson([
'found' => true,
'users' => [],
]);
}
public function testReadSingleUser()
{
$this->seed('UsersTableSeeder');
echo "\nTest: POST /users => Read single user";
$response = $this->get('/users/1');
$response->assertStatus(200);
$response->assertJson([
'found' => true,
'user' => [],
]);
}
public function testUpdateUser()
{
$this->seed('UsersTableSeeder');
echo "\nTest: POST /users => Create new user";
$data = [
'first_name' => 'first_updated_user',
'last_name' => 'last_updated_user',
'email' => 'email_updated@pm.com',
'password' => 'updated_password',
'phone_number' => '44444444444',
'updated_at' => '2000-1-1 10:10:00',
];
$response = $this->put('/users/1', $data);
$response->assertStatus(200);
$this->assertDatabaseHas('users', ['email' => $data['email']]);
}
}
这里的问题是每次测试都会刷新数据库。我需要在第一次测试运行之前和最后一次测试之后刷新迁移一次。
答案 0 :(得分:3)
这不是一个好主意:如果你需要它,这意味着你的测试不是独立的,甚至执行的顺序也会影响最终结果。
这不好:你应该遵循FIRST原则
了解更多here
答案 1 :(得分:2)
创建用户后会发生什么?例如,在数据库中存在多一个用户。例如,您可以在POST调用之前和之后对用户进行计数。
你真的不需要测试POST,但是当提交POST调用时会发生什么。
你不测试/user/{id}
是否存在。这使得测试依赖于id:测试必须是独立的。您可以在POST中进行相同的测试(创建用户),从响应或数据库中获取最后一个ID,然后获取该用户。这是一种检查数据库中完全相同的用户的方法。并且是一种删除id的方法。如果您依赖于ID,则测试仅运行一次。您的测试必须是可重复的。
每次花费太多时重置数据库。我建议你做以下几个步骤:
1)使用灯具重新创建数据库(正是您需要的测试) 2)运行所有测试
还要记住测试必须快速。持续时间超过15/20分钟的测试套件很慢!你需要快速。
阅读测试testReadSingleUser
,我建议您手动创建用户&#34;,检索ID,最后获取具有该ID的用户。这使得测试可重复无限次。