Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.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
Laravel PHPUnit每次测试后都不会刷新_Php_Laravel_Phpunit - Fatal编程技术网

Laravel PHPUnit每次测试后都不会刷新

Laravel PHPUnit每次测试后都不会刷新,php,laravel,phpunit,Php,Laravel,Phpunit,我目前正在测试登录和注册。问题是数据库在每次测试后都没有刷新,因此导致了错误 获取的错误:用户id应为1,但由于每次测试后数据库未重置,因此用户id为2。我在登录和注册测试中创建了一个新用户 您的LoginTest似乎在注册测试之前运行。由于您在那里创建了一个用户,它会自动获取id 1 RefreshDatabase不会为每个测试重新配置,它会在开始迁移之前刷新迁移 我建议您从assertDatabaseHas中删除id,因为测试id并不能真正实现任何目标: $this->assertDa

我目前正在测试登录和注册。问题是数据库在每次测试后都没有刷新,因此导致了错误

获取的错误:用户id应为1,但由于每次测试后数据库未重置,因此用户id为2。我在登录和注册测试中创建了一个新用户

您的LoginTest似乎在注册测试之前运行。由于您在那里创建了一个用户,它会自动获取id 1

RefreshDatabase不会为每个测试重新配置,它会在开始迁移之前刷新迁移

我建议您从assertDatabaseHas中删除id,因为测试id并不能真正实现任何目标:

$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();
    }