O que é o PHPSpec?
O PHPSpec é uma ferramenta de teste de comportamento escrita em PHP. Ele introdiz uma maneira diferente de escrever testes que se concentra em como o código deve se comportar em vez de simplesmente testar o seu resultado. Isto ajuda a manter o foco no problema a ser resolvido. Ao usar o PHPSpec, podemos escrever testes mais expressivos, mais legíveis e menos quebradiços.
Por que usar o PHPSpec?
A abordagem do PHPSpec para escrever testes é muito diferente da abordagem usual de escrever testes unitários com PHPUnit. Enquanto os testes unitários se concentram nas entradas e saídas do seu código, o PHPSpec se concentra em como o seu código deve se comportar. Isso o torna uma ótima ferramenta para escrever testes de integração, já que você pode conectar as várias partes do seu aplicativo e testar o comportamento geral. Além disso, a sintaxe do PHPSpec é muito legível e fácil de entender, tornando-se uma opção muito atraente para equipes de desenvolvimento.
Como instalar o PHPSpec no Symfony?
A instalação do PHPSpec no Symfony é muito fácil. Basta executar o seguinte comando no terminal:
composer require phpspec/phpspec
Isso irá instalar o PHPSpec e suas dependências no projeto do Symfony.
Como criar uma nova especificação com PHPSpec?
Para criar uma nova especificação com PHPSpec no Symfony, basta executar o seguinte comando no terminal a partir da raiz do projeto:
bin/phpspec describe Acme/DemoBundle/Entity/MyEntity
Isso irá criar um novo arquivo de especificação em `./spec/Acme/DemoBundle/Entity/MyEntitySpec.php`.
Como escrever uma especificação com PHPSpec?
Uma especificação PHPSpec é escrita em um método chamado `it`. Este método descreve o comportamento que você espera do seu código. Aqui está um exemplo de especificação:
function it_deve_retornar_true_quando_o_usuario_tem_mais_de_18_anos()
{
$usuario = new Usuario();
$usuario->setDataDeNascimento(new DateTime('18 years ago'));
$this->deveRetornarTrueQuandoUsuarioTemMaisDe18Anos($usuario)->shouldReturn(true);
}
Neste exemplo, estamos testando se a função deveRetornarTrueQuandoUsuarioTemMaisDe18Anos retorna verdadeiro quando o usuário tem mais de 18 anos.
Como executar uma especificação com PHPSpec?
Para executar uma especificação com PHPSpec, basta executar o seguinte comando no terminal:
bin/phpspec run
Isso irá executar todas as suas especificações e informá-lo se elas passaram ou não.
Como executar uma especificação específica com PHPSpec?
Para executar uma especificação específica com PHPSpec, basta executar o seguinte comando no terminal:
bin/phpspec run spec/Acme/DemoBundle/Entity/MyEntitySpec.php
Isso irá executar apenas a especificação especificada e informá-lo se elas passaram ou não.
Como usar o PHPSpec com Symfony Mocks?
PHPSpec suporta Symfony Mocks por padrão. Para usá-los, basta escrever uma especificação normalmente e usar o método `createMock` para instanciar o mock. Aqui está um exemplo de uso de mocks com PHPSpec:
function it_deve_salvar_o_usuario_quando_as_validacoes_passam()
{
$validator = $this->createMock('SymfonyComponentValidatorValidatorValidatorInterface');
$entityManager = $this->createMock('DoctrineORMEntityManagerInterface');
$userManager = new UserManager($validator, $entityManager);
$usuario = new Usuario();
$usuario->setNome('John Doe');
$usuario->setIdade(20);
$entityManager->expects($this->once())
->method('persist')
->with($usuario);
$entityManager->expects($this->once())
->method('flush');
$this->deveSalvarUsuario($usuario)->shouldReturn(true);
}
Aqui estamos usando o `createMock` para criar mocks para `SymfonyComponentValidatorValidatorValidatorInterface` e `DoctrineORMEntityManagerInterface`.
Como usar PHPSpec com Behat?
PHPSpec funciona muito bem em conjunto com o Behat. Ao usar o Behat para especificar o comportamento do seu aplicativo, você pode usar PHPSpec para garantir que essa especificação esteja sendo cumprida.
Para começar, crie sua especificação PHPSpec normalmente. Depois, no seu arquivo `.feature`, adicione uma linha que aponte para a especificação:
Given eu tenho uma especificação para salvar um usuário
Em seguida, adicione um cenário em que o comportamento seja testado:
Scenario: Salvar um usuário
Given eu tenho uma especificação para salvar um usuário
When salvo o seguinte usuário:
| Nome | Idade |
| John Doe | 20 |
Then o usuário deve ser salvo com sucesso
Neste exemplo, estamos testando se o usuário pode ser salvo com sucesso. Durante a execução do teste do Behat, a especificação PHPSpec será executada para garantir que o comportamento esteja correto.