Mock Objects com PHPUnit

April 01, 2008 at 11:49

Estou usando PHPUnit ultimamente como ferramenta de testes para o projeto que desenvolvo aqui na empresa onde trabalho. A parte que estou testando atualmente é a camada de banco de dados, usando PDO e geração de objetos como resultado, basicamente um ActiveRecord, com relacionamentos entre objetos e tudo mais.

Para testar as funcionalidades desta camada, pensei, sem nem pestanejar, em Mock Objects. Crio os mocks, conforme a necessidade, baseados em uma classe base que provê as funcões básicas para os modelos, e uso eles dentro de cada teste. Porém, como nem tudo são flores no mundo da programação, o framework de Mock Objects do PHPUnit tem um sério problema de compatibilidade com a forma de desenvolvimento que utilizo nos meus projetos, pois ele recria os métodos estáticos da classe base usando $this no código, então quando rodo os testes, booom, erro na hora.

Depois de muito tentar encontrar uma forma de resolver esse problema - pretendia usar mocks de qualquer jeito - acabei desistindo e partindo para uma solução tabajara, definir as classes vazias dentro do mesmo arquivo de testes, - eu sei, eu sei, a idéia é péssima.

Rodando os testes um a um, sem uma suite de testes, tudo corria normalmente, e eu estava feliz da vida. No mesmo dia, resolvi agrupar meus testes, criando uma suite, para que rodassem juntos, e assim, tornando tudo mais confiável. Foi mandar rodar e, boom, as classes definidas nos arquivos de testes possuiam o mesmo nome, como no PHP os requires servem para todo o script, foram gerados vários erros de classe redefinida, fazendo com que eu tivesse outra péssima idéia, checar se a classe existe antes de defini-la nos arquivos de testes, assim:

    
    if(!class_exists("User", false)) {
        class User extends Base {
        }
    }
    
    

Por enquanto sigo assim, não sei como isso funciona em outras linguagens, meu primeiro contato full com testes foi em PHP, se alguêm puder comentar me explicando, eu ficaria agradecido! :)