expect(actual).to matcher: envolvendo um valor, descrevendo o que ele deveria ser
Uma afirmação da suíte deste app
O curso logo antes deste, Fundamentos de RSpec, mostrou a forma de fora: describe, context e it, os blocos que organizam um teste e nomeiam o que ele verifica. Dentro de cada bloco it fica a afirmação em si, e o spec/services/identity/account_update_service_spec.rb deste app tem uma bem limpa:
it "updates the password when current password is correct" do
result = described_class.new(user, params).call
expect(result).to be_truthy
expect(user.reload.authenticate(new_password)).to be_truthy
end
O expect(result) embrulha o result, o valor que o teste produziu, num objeto que o RSpec monta para isso. O .to be_truthy entrega a esse objeto um matcher, be_truthy, que sabe verificar se o valor embrulhado é verdadeiro. Dois trabalhos, dois objetos: o expect guarda o valor real, e o matcher guarda a regra contra a qual ele é verificado.
Por que separar em duas chamadas
Um método só poderia receber as duas coisas de uma vez, como em assert_truthy(result). O RSpec separa porque o matcher (be_truthy, eq(5), include("x")) é um objeto independente, com lógica própria, reutilizável em qualquer lugar onde o expect é. expect(result).to be_truthy e expect(other_thing).to be_truthy passam pela mesma mecânica do be_truthy; só o valor embrulhado muda. As próximas cinco aulas leem o que cada matcher verifica no código-fonte instalado do RSpec.
.to e .not_to, a mesma ligação nas duas direções
O expect(...).to matcher passa quando a verificação do matcher dá certo. O expect(...).not_to matcher passa quando ela falha. O spec/models/identity/authentication_spec.rb deste app usa a forma negativa:
expect(new_auth).not_to be_valid
Mesmo expect, mesmo matcher, be_valid, e uma palavra inverte qual resultado conta como sucesso. O matcher não muda entre as duas formas, só qual lado da resposta dele o teste afirma.
O que este curso cobre
Sete aulas, cada uma checada contra os specs deste app ou o código-fonte instalado do RSpec. Esta aula trata da ligação expect/.to/.not_to. A aula 2 trata do eq, o matcher de igualdade simples. A aula 3 trata do include em arrays, strings e hashes. A aula 4 trata de be_truthy/be_falsey/be_nil, e de um caso em que a alternativa que parece óbvia, eq(true), falha. A aula 5 trata da forma com bloco, expect { ... }.to change { ... } e expect { ... }.to raise_error(...), e de por que ela precisa de um bloco. A aula 6 é um guia de campo para o resto dos matchers deste app, be_valid, have_http_status, redirect_to e be_empty, mais o encadeamento de dois matchers com .and. A aula 7 fecha com um desafio: um pequeno despachante de matchers em Ruby puro.
Continue com a aula 2
eq: comparando com o == do Ruby, lido do código do RSpec
Por que o eq roda o == do Ruby e como isso funciona com strings e objetos ActiveRecord.
Com uma conta grátis você também tem os quizzes, seu progresso e suas anotações, e a discussão.