forum
forum copied to clipboard
Como usar dois arquivos de .env com Dusk
Estou com problemas para carregas as informações do arquivo .env.dusk.local sempre que tento executar algum teste ele pega as informações do .env original e acaba apagando os dados do meu banco.
Problema Encontrado
Este é meu arquivo .env com as informações do banco de dados padrão.
APP_ENV=local
APP_KEY=<editado>
APP_DEBUG=true
APP_LOG_LEVEL=debug
APP_URL=http://localhost:8000
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_dusk
DB_USERNAME=root
DB_PASSWORD=123456
Este é meu arquivo .env.dusk.local com as informações do banco de dados que seria usado para teste.
APP_ENV=local
APP_KEY=<editado>
APP_DEBUG=true
APP_LOG_LEVEL=debug
APP_URL=http://localhost:8000
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_dusk_test
DB_USERNAME=root
DB_PASSWORD=123456
Eu executei o comando php artisan serve e criei um novo usuário pela rota /register.
Depois criei uma função para testar o login. Primeiro eu crio um usuário com uma factory passando apenas o email (o mesmo que eu usei anteriormente).
Mas quando eu executo o php artisan dusk ele me da a mensagem que o email já esta sendo usado, ou seja, ele não esta pegando as informações do meu .env.dusk.local ele está utilizando meu banco de dados padrão.
Esta é a minha função de teste.
namespace Tests\Browser;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Support\Facades\App;
use Tests\DuskTestCase;
class LoginTest extends DuskTestCase
{
use DatabaseMigrations;
/**
* A Dusk test example.
*
* @return void
*/
public function testLogin()
{
$user = factory(\App\User::class)->create(['email' => '[email protected]']);
$this->browse(function ($browser) use ($user) {
$browser->visit('/login')
->type('email', $user->email)
->type('password', 'secret')
->press('Login')
->assertPathIs('/home');
});
}
}
Coloquei o código desse projeto no git também
Abordagem
Atualização 1
Solução
Isso parece estar de alguma forma relacionado com a issue laravel/dusk#96. 🤔
O curioso é que eu não consegui reproduzir o problema. Instalei o Laravel 5.4 e o Dusk numa instalação limpa, fiz um teste usando o assertEquals() dentro do arquivo de teste do Dusk para verificar se ele lê as variáveis de ambiente corretamente através do env() e ao executar o php artisan dusk ele efetivamente lê o arquivo .env.dusk.local, onde eu troquei as variáveis de conexão do banco. Também usei o helper factory() para popular o banco, o registro é criado no banco de testes normalmente e ao terminar o teste é feito rollback de tudo. O banco de dados do .env não foi afetado, de modo que tudo parece estar como o esperado. 😐
Dito isso não faço idéia do porque isso possa estar ocorrendo. Eu não cheguei a testar a parte do $this->browse() porque o meu Chrome está zuado, mas pelo que tu explicou o erro ocorre já na linha do factory().
Seria uma boa testar as variáveis de ambiente dentro do teste para ver o que você está recebendo. Talvez uma saída seja o que bbashy comentou lá na issue, de usar uma conexão própria para o Dusk. Não faço idéia se isso vai resolver, mas é algo que eu tentaria. 👍
php artisan serve --env=dusk.local
pphp artisan dusk
Seu serve está carregando suas variáveis de ambiente principal (.env) enquanto que o Dusk está carregando .env.dusk.local, no entanto, o Dusk vai executar o navegador (outro processo) e acessar seu servidor (que por sua vez está usando .env), por isso o problema. Informe seu serve para utilizar as mesmas variáveis de ambiente que você sabe que o Dusk usará.