---
# System prepended metadata

title: Proposta da implementação de testes unitários

---

# 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

