forum icon indicating copy to clipboard operation
forum copied to clipboard

Como usar dois arquivos de .env com Dusk

Open devlucaslopes opened this issue 8 years ago • 2 comments
trafficstars

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

devlucaslopes avatar Mar 27 '17 14:03 devlucaslopes

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. 👍

paulofreitas avatar Mar 29 '17 04:03 paulofreitas

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á.

deleugpn avatar Apr 25 '17 08:04 deleugpn