# Proposta da implementação de testes unitários ## Four-Phase Test O que é? ## Setup (Arrange ou Given) <br> * Inicializa o objeto * Define o valor dos dados ```ruby= # Arrange event = { message: "an error event" } worker = described_class.new allow(Raven).to receive(:send_event).with(event) ``` ## Exercise (Act ou When) <br> * Invoca o método * Passa os parâmetros organizados ```ruby= # Act worker.perform(event) ``` ## Verify (Assert ou Then) <br> * Verifica se o resultado esperado foi obtido ```ruby= # Assert expect(Raven).to have_received(:send_event).with(event) ``` ## Teardown <br> * Limpa os dados que foram utilizados --- <!--- Nos exemplos dado não foi utilizada a etapa de Teardown porque não foi necessário e o próprio RSpec se encarrega de limpar os dados criados no teste. http://shipit.resultadosdigitais.com.br/blog/ruby-e-rspec-melhorando-a-legibilidade-de-seus-testes/ ---> 👍 ```ruby describe "#perform" do it "sends event to Sentry" do # Arrange event = { message: "an error event" } worker = described_class.new allow(Raven).to receive(:send_event).with(event) # Act worker.perform(event) # Assert expect(Raven).to have_received(:send_event).with(event) end end ``` --- 👎 ```ruby describe "#perform" do it "sends event to Sentry" do allow(Raven).to receive(:send_event) described_class.new.perform({message: "an error event"}) expect(Raven) .to have_received(:send_event) .with({message: "an error even"}) end end ``` --- **Vantagens:** * Melhora a legibilidade dos testes * Cria um padrão entre os testes * “Junior-Friendly” **Desvantagens:** * CTRL-C + CTRL+V entre os contextos * Aumento no tamanho do arquivo * Refatoração pode exigir mudanças em diversos locais --- ## Conceitos de DRY e DAMP DAMP = Descriptive and Meaningful Phrases -> Frases descritivas e significativas DRY = Don't Repeat Yourself -> Não se repita **Obs: O DRY diz respeito a não duplicação de *conceito de domínio* e não sobre o *código* diretamente** O uso de "lets" e "befores" no RSpec muitas vezes envolve a não repetição de código. Desvantagens ao usar "lets" e "befores": * Acoplamento entre os testes * “Montanha russa” dos contextos * Dificulta a legibilidade dos testes * Cognitive overload Um comentário bem válido do José Valim (criador do Elixir) que vai de encontro com o que foi citado: https://elixirforum.com/t/how-to-describe-many-contexts-in-exunit-without-a-hierarchy/1551/2