无法在 Laravel Dusk 中使用正确的环境数据库
Cannot use right environment database with Laravel Dusk
- 我有两个环境文件:
.env
和 .env.dusk.testing
(因为如果我对环境处理程序不明确,.env
会不断被覆盖)。
- 我有两个开发服务器:
- 端口
8080
中的一个使用 .env
(使用命令 php artisan serve --port=8080
)
- 端口
8000
中的一个使用 .env.dusk.testing
(使用命令 php artisan serve --env=dusk.testing
)
我正在尝试一个非常基本的测试。登录用户。它不工作,因为它没有使用正确的数据库。
.env
APP_NAME=DEV
APP_ENV=local
APP_DEBUG=true
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5433
DB_DATABASE=db
DB_USERNAME=dbuser
DB_PASSWORD=****
.env.dusk.testing
APP_NAME=DUSK
APP_ENV=testing
APP_DEBUG=true
DB_CONNECTION=sqlite
phpunit.dusk.xml
...
<php>
<env name="APP_ENV" value="testing"/>
<env name="DB_CONNECTION" value="sqlite"/>
<env name="DB_DATABASE" value=":memory:"/>
</php>
...
我还在 config/database.php
中定义了 sqlite
连接,如下所示:
'sqlite' => [
'driver' => 'sqlite',
'database' => ':memory:',
'prefix' => '',
],
我的测试使用设置方法擦除用户并将其保存在数据库中。
namespace Tests\Browser;
use App\User;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Laravel\Dusk\Browser;
use Tests\DuskTestCase;
class ExampleTest extends DuskTestCase
{
use DatabaseMigrations;
protected $user;
public function setUp(): void
{
parent::setUp();
$this->user = factory(User::class)->create([
'nombre' => 'John Doe',
'email' => 'john.doe@testing.com',
'password' => bcrypt('password')
]);
}
/** @test */
public function guest_user_can_authenticate_with_valid_credentials()
{
$this->browse(function (Browser $browser) {
$browser->assertGuest()
->visit('/login')
->type('@email', $this->user->email)
->type('@password', 'password')
->click('@login-button')
->assertAuthenticatedAs($this->user)
->assertUrlIs('/dashboard')
->logout();
});
}
}
使用 DatabaseMigrations
特征清除了我的 PostgreSQL 数据库,而不是使用 SQLite 数据库。我尝试改用 RefreshDatabase
但结果相同。我的环境数据库被清除了。
并且在这两种情况下测试都失败了。用户被保存到 SQLite 测试数据库中,但它仍在测试中查看另一个数据库并在此过程中销毁它。
我几乎要完全放弃这个包和浏览器测试了。这一点都不简单。文档很浅,无法按预期工作。
我的问题已被
解决
- 没有使用 in-memory SQLite 数据库(我使用了
.sqlite
文件)。
- 使用
DatabaseMigrations
特征而不是 RefreshDatabase
。
- 在 运行 dusk 时明确环境文件。
php artisan dusk --env=dusk.testing
.
- 我有两个环境文件:
.env
和.env.dusk.testing
(因为如果我对环境处理程序不明确,.env
会不断被覆盖)。 - 我有两个开发服务器:
- 端口
8080
中的一个使用.env
(使用命令php artisan serve --port=8080
) - 端口
8000
中的一个使用.env.dusk.testing
(使用命令php artisan serve --env=dusk.testing
)
- 端口
我正在尝试一个非常基本的测试。登录用户。它不工作,因为它没有使用正确的数据库。
.env
APP_NAME=DEV
APP_ENV=local
APP_DEBUG=true
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5433
DB_DATABASE=db
DB_USERNAME=dbuser
DB_PASSWORD=****
.env.dusk.testing
APP_NAME=DUSK
APP_ENV=testing
APP_DEBUG=true
DB_CONNECTION=sqlite
phpunit.dusk.xml
...
<php>
<env name="APP_ENV" value="testing"/>
<env name="DB_CONNECTION" value="sqlite"/>
<env name="DB_DATABASE" value=":memory:"/>
</php>
...
我还在 config/database.php
中定义了 sqlite
连接,如下所示:
'sqlite' => [
'driver' => 'sqlite',
'database' => ':memory:',
'prefix' => '',
],
我的测试使用设置方法擦除用户并将其保存在数据库中。
namespace Tests\Browser;
use App\User;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Laravel\Dusk\Browser;
use Tests\DuskTestCase;
class ExampleTest extends DuskTestCase
{
use DatabaseMigrations;
protected $user;
public function setUp(): void
{
parent::setUp();
$this->user = factory(User::class)->create([
'nombre' => 'John Doe',
'email' => 'john.doe@testing.com',
'password' => bcrypt('password')
]);
}
/** @test */
public function guest_user_can_authenticate_with_valid_credentials()
{
$this->browse(function (Browser $browser) {
$browser->assertGuest()
->visit('/login')
->type('@email', $this->user->email)
->type('@password', 'password')
->click('@login-button')
->assertAuthenticatedAs($this->user)
->assertUrlIs('/dashboard')
->logout();
});
}
}
使用 DatabaseMigrations
特征清除了我的 PostgreSQL 数据库,而不是使用 SQLite 数据库。我尝试改用 RefreshDatabase
但结果相同。我的环境数据库被清除了。
并且在这两种情况下测试都失败了。用户被保存到 SQLite 测试数据库中,但它仍在测试中查看另一个数据库并在此过程中销毁它。
我几乎要完全放弃这个包和浏览器测试了。这一点都不简单。文档很浅,无法按预期工作。
我的问题已被
解决- 没有使用 in-memory SQLite 数据库(我使用了
.sqlite
文件)。 - 使用
DatabaseMigrations
特征而不是RefreshDatabase
。 - 在 运行 dusk 时明确环境文件。
php artisan dusk --env=dusk.testing
.