Laravel PHPUnit每次测试后都不会刷新
我目前正在测试登录和注册。问题是数据库在每次测试后都没有刷新,因此导致了错误 获取的错误:用户id应为1,但由于每次测试后数据库未重置,因此用户id为2。我在登录和注册测试中创建了一个新用户 您的LoginTest似乎在注册测试之前运行。由于您在那里创建了一个用户,它会自动获取id 1 RefreshDatabase不会为每个测试重新配置,它会在开始迁移之前刷新迁移 我建议您从assertDatabaseHas中删除id,因为测试id并不能真正实现任何目标:Laravel PHPUnit每次测试后都不会刷新,php,laravel,phpunit,Php,Laravel,Phpunit,我目前正在测试登录和注册。问题是数据库在每次测试后都没有刷新,因此导致了错误 获取的错误:用户id应为1,但由于每次测试后数据库未重置,因此用户id为2。我在登录和注册测试中创建了一个新用户 您的LoginTest似乎在注册测试之前运行。由于您在那里创建了一个用户,它会自动获取id 1 RefreshDatabase不会为每个测试重新配置,它会在开始迁移之前刷新迁移 我建议您从assertDatabaseHas中删除id,因为测试id并不能真正实现任何目标: $this->assertDa
$this->assertDatabaseHas('users', [
'username' => $username,
'email' => $email,
]);
您必须看到phpunit.xml配置文件:如果您使用的是传统的测试数据库,而不是内存数据库,那么它似乎是正确的 在Larav.6中,调用refreshTestDatabase,该数据库在Lightlight\Foundation\Testing\RefreshDatabase trait中定义 仅在第一次迭代中,当RefreshDatabaseState::$migrated为false时,将运行migrate:fresh并将RefreshDatabaseState::$migrated设置为true
在后续迭代中,同一类中的后续测试将跳过此块。从文档中可以看出,RefreshDatabase在每次测试后都会刷新。--在每次测试后重置数据库通常很有用,这样以前测试的数据就不会干扰后续测试。RefreshDatabase特性采用最佳方法迁移测试数据库,具体取决于您使用的是内存数据库还是传统数据库。在测试类中使用trait,一切都会为您处理:它在第一次测试之前执行php artisan:fresh,然后在事务中封装各个测试。如果每次测试都迁移,那么测试将花费太长的时间。您可以通过记录测试期间运行的查询来尝试,并亲自查看。这些事务用于重置数据库,无需迁移。@johnnysoto,检查源代码。它检查迁移标志,如果为false,则运行migrate:fresh并将标志设置为true。然后它开始一个数据库事务
<?php
namespace Tests\Unit;
use App\User;
use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;
class RegisterTest extends TestCase
{
use RefreshDatabase;
/**
* A basic test example.
*
* @return void
*/
/** @test */
public function successful_register()
{
$username = 'JohnRock';
$email = 'hello@email.com';
$password = 'fjIRHJV@#(*UH(@#*H78))';
$user = [
'username' => $username,
'email' => $email,
'password' => $password,
'password_confirmation' => $password
];
$response = $this->post('/register', $user);
$this->assertDatabaseHas('users', [
'id' => 1,
'username' => $username,
'email' => $email
]);
}
}
<?php
namespace Tests\Unit;
use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;
class LoginTest extends TestCase
{
use RefreshDatabase;
/**
* A basic test example.
*
* @return void
*/
/** @test */
public function login_successful()
{
$user = factory('App\User')->create();
$response = $this->post('/login', [
'username' => $user->username,
'password' => $user->password
]);
$response->assertRedirect('/');
}
}
$this->assertDatabaseHas('users', [
'username' => $username,
'email' => $email,
]);
/**
* Refresh a conventional test database.
*
* @return void
*/
protected function refreshTestDatabase()
{
if (! RefreshDatabaseState::$migrated) {
$this->artisan('migrate:fresh', [
'--drop-views' => $this->shouldDropViews(),
'--drop-types' => $this->shouldDropTypes(),
]);
$this->app[Kernel::class]->setArtisan(null);
RefreshDatabaseState::$migrated = true;
}
$this->beginDatabaseTransaction();
}