Unit + Functional test o Symfony4 Messenger

Kim Wuestkamp em codeburst Segue 2 de jul · 4 min ler https://unsplash.com/photos/Jrl_UQcZqOc

Então você está usando o incrível componente do Symfony4 Messenger ? Ótimo. Agora você gostaria de fazer alguma unidade sofisticada e testes funcionais? Impressionante!

Mostraremos isso estendendo nosso exemplo da API de reserva de antes.

Peças

  1. Visão geral e demonstração simples do Symfony Messenger
  2. (Este artigo)

O que faremos aqui hoje?

  1. Primeiro vamos mostrar os componentes de um projeto simples para usar o Symfony Messenger com
  2. então vamos escrever um teste unitário
  3. então um funcional.

Execute o projeto sozinho se você gosta desse tipo de coisa

Isso tudo já está feito no branch step3 deste repo:

 git clone git@github.com : wuestkamp / symfony-messaging-queueing-exemplo.git cd symfony-mensagens-enfileirando-exemplo 
git checkout step3
instalação do compositor
bin / console doctrine: schema: create
bin / console doctrine: lumintures: carga -n
bin / console server: run
# chame o trabalhador em um terminal separado
bin / console messenger: consumir -vv
# executar testes unitários
bin / phpunit

O fluxo de trabalho de reserva simples

O que esse projeto simples pode fazer? É uma API de reserva e pode listar e criar reservas:

Listar Reservas

Ligue para http://127.0.0.1:8000/bookings para ver as reservas existentes, receberemos um retorno json. Eu uso o Postman para chamar a API, mas você também pode usar o curl ou qualquer navegador.

/ reservas

Criar uma reserva

Ligue para http://127.0.0.1:8000/bookings/create/new-booking para criar uma nova reserva, que retornará:

/ reservas / criar / nova reserva

A nova reserva foi criada instantaneamente com o status de "novo".

Processamento de trabalhadores

Nosso processo de trabalho ( bin/console messenger:consume -vv ) receberá a nova reserva, fará algum processamento de alta qualidade e mudará o status de nossa reserva para “criado”:

Status atualizado

Ligue novamente para http://127.0.0.1:8000/bookings :

/ reservas

Demonstração bastante simples sobre como processos complexos podem ser tratados usando o Symfony Messenger .

A comunicação do componente

Visão geral dos componentes usados na API de reserva simples. Vamos escrever testes para os componentes vermelhos.

O BookingManager é apenas outro nível de abstração, o BookingController e o CreateBookingMessageHandler também podem trabalhar diretamente com o BookingRepository .

comunicação componente

Os componentes no código

BookingController

Aqui nós realmente ligamos para o BookingManager

BookingManager

CreateBookingMessage

Armazenamos o id de uma reserva na mensagem para que possamos consultá-la no CreateBookingMessageHandler

CreateBookingMessageHandler

Aqui nós pegamos o id de um Booking do CreateBookingMessage , então usamos o BookingManager para consultar e talvez processá-lo.

Testes Unitários

CreateBookingMessageHandlerTest

./bin/phpunit para executar. Fiz alguns comentários que devem tornar tudo explicativo.

Observe a anotação @group time-sensitive que faz com que o sleep(5) não espere 5 segundos, graças à Ponte Phpunit do Symfony !

Há mais um caso de teste negativo no arquivo CreateBookingMessageHandlerTest.php no repositório.

Teste funcional

Na verdade, chamaremos o componente worker nesse teste , o que é muito legal.

Com testes funcionais, estamos inicializando o kernel e podemos consultar serviços normalmente usando DependencyInjection. Nós também temos (ou precisamos) acessar um banco de dados, para isso nós configuramos config/packages/test/doctrine.yaml :

 doutrina: 
dbal:
motorista:
pdo_sqlite

memória: true

charset: UTF8

url: sqlite: ///: memory:

BookingManagerTest

Estamos usando o arquivo DatabaseCleaner.php para garantir que estamos sempre trabalhando com um banco de dados vazio com esquema carregado.

A parte interessante acontece na linha 57, onde realmente chamamos o processo de trabalho !

Então, neste teste nós fizemos:

  1. ligue para o BookingManager para criar uma Reserva
  2. Certifique-se de que isso criou um novo CreateBookingMessage no transporte da doutrina do Symfony Messenger
  3. execute o componente do Symfony Messenger
  4. verifique se isso chamou o CreateBookingMessageHandler corretamente

Muito doce se você me perguntar!

O fim.

Nosso teste de integração / funcional agora demora 5 segundos por causa do sleep(5); linha dentro do BookingManger . Eu acho que isso é o que queremos, porque aqui simulamos a realidade!

Deixe-me saber se você tem alguma sugestão ou melhorias!