Testes com Mocks utilizando PHP Unit 9
- Os usuários podem dar lances em um leilão
- Um leiloeiro avalia o leilão informando qual o maior valor de lance, qual o menor valor e os 3 maiores lances
- Um usuário não pode dar dois lances consecutivos
- Um usuário só pode dar no máximo 5 lances
- Testes devem ser criados para verificar essas especificações
- Leilões com mais de uma semana devem ser finalizados
Tipo | Descrição |
---|---|
Mock | Tem como objetivo verificar o comportamento. São objetos pré-programados com expectativas das mensagens (métodos e seus parâmetors) que vão receber. |
Dummy | Nunca são utilizados. Geralmente servem pra peencher requisitos dps parâmetros de algum método. |
Fakes | Realmente funcionam, mas normalmente tomam algum tipo de atalho. Ex: Banco em memória |
Stubs | Fornecem respostas pré-definidas ás chamadas dos métodos pré-definidos durante o teste. Normalmente não respondem ao que não foram explicidamente programados para responder. |
Spies | Stubs que também gravam algum tipo de informação. Ex: Guardar quantidade de mensagens enviadas em um serviço de e-mail. |
Cria uma classe 'Falsa' que representará a classe LeilaoDao.
$leilaoDao = $this->createMock(LeilaoDao::class);
O método recuperarNaoFinalizados irá retornar um array:
$leilaoDao->method('recuperarNaoFinalizado')
->willReturn([$fiat, $variant]);
$leilaoDao->expects($this->exactly(2))
->method('atualiza');
$leilaoDao->expects($this->exactly(2))
->method('atualiza')
->withConsecutive(
[$fiat],
[$variant]
);
$leilaoDao->expects($this->once())
->method('atualiza')
->with($fiat);
Definindo argumentos pro construtor, por exemplo:
$leilaoDao = $this->getMockBuilder(LeilaoDao::class)
->setConstructorArgs([new \PDO('sqlite::memory:')])
->getMock;
$this->enviadorEmail->expects($this->exactly(2))
->method('notificarTerminoLeilao')
->willReturnCallBack(function (Leilao $leilao) {
static::assertTrue($leilao->estaFinalizado());
});
- Evitar métodos estáticos porque não é possível criar dublês de testes com eles
- Em caso de necessidade de métodos estáticos, pegar o retornar dele e receber por injeção de dependência
- Utilizar injeção de dependência