4

如果我使用 RefreshDatabase 特征,我的测试将失败。

没有这个特征——测试将通过,但数据仍保留在数据库中。

我在用着:

  • Laravel 5.5(一个新鲜的)
  • Laradock:nginx mysql selenium

测试正在 laradock 的工作区运行。

这是来自官方文档的简单测试。

<?php

namespace Tests\Browser;

use App\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Laravel\Dusk\Browser;
use Tests\DuskTestCase;

class LoginTest extends DuskTestCase
{
    use RefreshDatabase;

    /**
     * A Dusk test example.
     *
     * @return void
     */
    public function testLogin()
    {
        $user = factory(User::class)->create();

        // dump('wait...');
        // sleep(15);
        // dump('go!');

        $this->browse(function (Browser $browser) use ($user) {
            $browser->visit('/login')
                    ->type('email', $user->email)
                    ->type('password', 'secret')
                    ->press('Login')
                    ->assertPathIs('/home')
            ;
        });
    }
}

dump/sleep/dump只是查看数据库中是否已经创建了用户。它不是!

结果php artisan dusk是:

There was 1 failure:

1) Tests\Browser\LoginTest::testLogin
Failed asserting that '/login' matches PCRE pattern "/^\/home/u".

/var/www/vendor/laravel/dusk/src/Concerns/MakesAssertions.php:53
/var/www/tests/Browser/LoginTest.php:32
/var/www/vendor/laravel/dusk/src/TestCase.php:92
/var/www/tests/Browser/LoginTest.php:34

注意:
断言文本“这些凭据与我们的记录不匹配”。将是真的,所以我相信从未创建过用户。

4

3 回答 3

0

使用DatabaseMigrations特质而不是RefreshDatabase特质。

于 2018-03-02T22:57:09.117 回答
0

Laravel Dusk文档中提到:

您编写的大多数测试将与从应用程序数据库中检索数据的页面进行交互;然而,你的 Dusk 测试不应该使用这个RefreshDatabase特性。该RefreshDatabase特征利用了在 HTTP 请求中不适用或不可用的数据库事务。相反,使用DatabaseMigrationstrait,它为每个测试重新迁移数据库:

所以答案是使用DatabaseMigrations而不是RefreshDatabase

于 2021-12-13T10:11:26.000 回答
0

我认为问题不在于使用 sqlite/pgsql/whateversql 驱动程序。而且我确定您不需要将$app['config']...线条之类的东西放到\Tests\CreatesApplication::createApplication.

artisan config:clear之前解决了这个问题artisan serve。它将创建新的 phpunit.dusk.xml 路由到.env.dusk.{env},然后重新运行黄昏命令。

于 2019-09-05T11:11:06.420 回答