# 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