Jasmine: criando spies

Há algum tempo atrás, escrevi umas groselhas sobre Jasmine: um post foi mais uma introdução sobre o framework e o outro post foi sobre os matchers que o Jasmine nos oferece.

O que são os spies?

Basicamente quando usamos Jasmine especificamos nos testes como nosso código deve (ou deveria) funcionar. Ao usar um spy conseguimos fazer com que ele fique de olho em partes do nosso programa, assim essa parte pode ser substituída por um spy (que pode ser uma função ou objeto). Assim, conseguimos testar se determinada função está sendo chamada e se está sendo chamada com os argumentos esperados. Confuso? Vamos lá…

Imagine que temos uma brincadeira assim:

Acima, temos um construtor de sanduíche ¯\_(ツ)_/¯ e dois métodos: um que vai adicionar ingredientes ao nosso sanduíche e outro que irá retornar a lista com os ingredientes do sanduíche super gostoso.

Agora, como testamos pra saber se os métodos estão funcionando do jeito que esperamos? Podemos começar com algo assim:

O que fizemos no código acima foi o seguinte:

Assim, se rodarmos nosso teste, vamos ver que ele passou, ou seja, o método addIngredient está sendo chamado perfeitamente.

Print da tela mostrando que o teste passou

Agora, se quisermos verificar se esse mesmo método está sendo chamado com os argumentos corretos poderíamos adicionar a seguinte spec:

Nessa nova spec utilizamos do matcher toHaveBeenCalledWith() com o argumento que esperamos que tenha sido chamado (conforme a chamada que fizemos no beforeEach). Feito isso, ao rodarmos nossos testes:

Print da tela mostrando que o teste passou

Resumidamente o spyOn substitui a função, interceptando assim as suas chamadas e acompanhando algumas informações importantes sobre ela para utilizarmos em nossas specs. Aí temos um ponto a se considerar: dessa maneira perdemos as capacidades da função original. Para resolver isso podemos usar o andCallThrough(). Vamos lá:

Acima, apenas preparamos o terreno:

Com isso então, podemos criar nossas specs:

No exemplo acima, criamos duas specs:

Aí é só rodarmos nossos testes:

Print da tela mostrando que o teste passou

Valeu ao grande Weslley Araujo pela ajuda na revisão do post.

Ver mais posts