Muitos aplicativos modernos de banco de dados usam o projeto Doctrine ORM .
É uma boa prática levar o trabalho com o banco de dados aos serviços. E os serviços precisam ser testados.
Para testar serviços, você pode conectar um banco de dados de teste ou bloquear o Entity Manager e os repositórios. Com a primeira opção, tudo fica claro, mas nem sempre faz sentido implantar um banco de dados para testar o serviço. Nós vamos falar sobre isso.
Por exemplo, tome o seguinte serviço:
src / Serviço / Usuário / UserService.php Precisamos testar seu único método create()
.
Selecione os seguintes casos:
- Criação de usuário bem-sucedida sem referenciador
- Criação de usuário bem-sucedida com referenciador
- Erro "Login já realizado"
- Erro "Referenciador não encontrado"
Para testar o serviço, precisamos de um objeto que implemente a interface Doctrine\ORM\EntityManagerInterface
Opção 1. Usamos um banco de dados real
Escreveremos uma classe base para testes, da qual herdaremos mais tarde.
Agora faz sentido para os testes definir variáveis de ambiente. Adicione-os ao arquivo phpunit.xml
na seção php
. Vou usar o sqlite db
phpunit.xml <?xml version="1.0" encoding="UTF-8"?> <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/8.1/phpunit.xsd" bootstrap="vendor/autoload.php" executionOrder="depends,defects" forceCoversAnnotation="true" beStrictAboutCoversAnnotation="true" beStrictAboutOutputDuringTests="true" beStrictAboutTodoAnnotatedTests="true" verbose="true" colors="true"> <php> <env name="DB_DRIVER" value="pdo_sqlite" /> <env name="DB_PATH" value="var/db-test.sqlite" /> <env name="DB_USER" value="" /> <env name="DB_PASSWORD" value="" /> <env name="DB_NAME" value="" /> </php> <testsuites> <testsuite name="default"> <directory>tests/Unit</directory> </testsuite> </testsuites> <filter> <whitelist processUncoveredFilesFromWhitelist="true"> <directory suffix=".php">src</directory> </whitelist> </filter> </phpunit>
Agora vamos escrever um teste de serviço
testes / Unidade / Serviço / UserServiceTest.php Verifique se o nosso serviço está funcionando corretamente
./vendor/bin/phpunit
Opção 2. Usando o MockBuilder
Construir um banco de dados sempre é difícil. Especialmente o phpunit nos dá a oportunidade de coletar moki em tempo real usando o mockBuilder. Um exemplo pode ser encontrado na documentação do Symfony.
Exemplo de documentação do Symfony A opção está funcionando, mas há problemas. Você precisa saber claramente em qual sequência o código acessa os métodos EntityManager.
Por exemplo, se um desenvolvedor trocar a verificação da existência de um referenciador e a verificação de logon ocupado, o teste será interrompido. Mas a aplicação não é.
Proponho a opção do EntityManager de moking inteligente, que armazena todos os dados na memória e não usa um banco de dados real.
Opção 3. Usamos o MockBuilder com armazenamento de dados na memória.
Para flexibilidade, adicionaremos uma variável de ambiente para que você possa usar um banco de dados real. Vamos phpunit.xml
inverno no phpunit.xml
Alterações no phpunit.xml <?xml version="1.0" encoding="UTF-8"?> <php> <env name="EMULATE_BD" value="1" /> </php>
Agora modifique a classe base
testes modificados / TestCase.php Agora podemos executar o teste novamente e garantir que nosso serviço funcione sem conectar-se ao banco de dados.
./vendor/bin/phpunit
Código-fonte disponível no Github