Auto limpar BD nos testes via codeception no yii2

26 views
Skip to first unread message

Sidney

unread,
Feb 17, 2015, 6:34:20 PM2/17/15
to yii-framew...@googlegroups.com
Boa noite pessoal,

Estou escrevendo testes funcionais (enfim!) e estão funcionando a contento, exceto por um motivo. O teste preenche um certo formulário e o envia e depois faz algumas confirmações para ver se tudo funcionou bem. Porém, a cada execução do teste um novo registro do model atrelado ao form (Notícia) é gerado no banco. Ou seja, 10 testes executados, 10 registros novos.

Preciso que o BD seja reiniciado a cada teste funcional, seja por exclusão e recriação ou por truncar as tabelas.

Já li o manual do codeception quase inteiro, já pesquisei em tudo o que se possa chamar de internet, já varri o mundo e nada, não encontrei solução. Já tentei utilizar a solução oferecida no Codeception (veja a seguir) mas já inclui a configuração em vários arquivos *.yml para tentar descobrir qual o correto (sempre refazendo o codecept build) e não consegui.

Configuração que tentei:
modules:
    config:
        Db:
            dns: 'mysql:host=localhost;dbname=banco_testes'
            user: 'root'
            password: 'secret'
            dump: dump-de-dados.sql

Alguém que trabalhe com testes ou saiba como resolver isso poderia dar um HELPÃO aí?
Agradeceria muito!

Atenciosamente,
Sidney Lins
------

Railton Nepomuceno

unread,
Feb 18, 2015, 4:32:04 PM2/18/15
to yii-framew...@googlegroups.com
Tenta isso na conexão do yii2
'db' => [
+ 'class' => 'yii\db\Connection',
+ // ...
+ 'on afterOpen' => function($event) {
+ $event->sender->createCommand("SET time_zone = 'UTC'")->execute();
+ }
+ ],

Tanta por no na conexao um  "delete from tabela", e quando o yii2 for iniciar a conexao ele irá deletar.

Sidney

unread,
Feb 18, 2015, 5:02:12 PM2/18/15
to yii-framew...@googlegroups.com
Cara, não seria o "padrão, mas com certeza você me deu uma EXCELENTE ideia! Vou tentar alguma coisa assim mas usando truncate! Depois posto aqui se deu certo ou quando eu descobrir como usar o jeito "oficial".

Muito obrigado Railton!
Abraço!

Atenciosamente,
Sidney Lins

--
YFB - Yii Framework Brasil
04/2011: Anexos de até 250kb foram autorizados pelos membros da lista. Use com moderação.
---
Você recebeu essa mensagem porque está inscrito no grupo "YFB - Yii Framework Brasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para yii-framework-br...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/yii-framework-brasil/ff1a04b9-f1e3-443d-beb1-19f98a68363e%40googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Sidney

unread,
Feb 18, 2015, 7:03:10 PM2/18/15
to yii-framew...@googlegroups.com
Parcialmente resolvido!!

Conforme prometi, segue meu código (talvez sirva pra outros) baseado no evento onAfterOpen da conexão, sugestão do Railton (valeu mesmo!):

// no meu arquivo tests/codeception/config/config.php
'db' => [
            'dsn' => '....',
            'on afterOpen' => function ($event) {
                $path = dirname(__DIR__) . '/path/to/the/dumpFile.sql';
                $sql = file_get_contents($path);
                $event->sender->pdo->exec($sql);
            },
],

No meu dumpfile tenho diversas instrucoes, incluindo TRUNCATE tabelas e reinserção de registros. Foi necessário usar o PDO pois o Command::execute() só executa um comando sql por chamada, ignorando os demais.

Ainda vou tentar resolver isso usando o "jeito codeception" de fazer, por isso, ainda aceito sugestões. Mas por hora, está de bom tamanho!

Atenciosamente,
Sidney Lins
------

Reply all
Reply to author
Forward
0 new messages