Concrete Logo
Hamburger button

Algumas dicas de RSpec

  • Blog
  • 2 de Julho de 2013
Share

A DSL do RSpec é muito rica em recursos. Infelizmente nem sempre conhecemos todos eles. Este post é uma pequena compilação de alguns matchers e sintaxes alternativas não tão conhecidas, mas que podem auxiliar na árdua tarefa de escrever testes concisos e expressivos.

Before com condições

É possível definir condições para um bloco before:

No exemplo acima, o before será executado apenas no primeiro bloco it, pois ele possui o metadado mycondition definido como true.

Expect

Desde o RSpec 2.11 uma nova sintaxe de expectativas (!?) está disponível:

Apesar do já conhecido should ser mais elegante, ele nem sempre é confiável. Basicamente o RSpec precisa definí-lo em todos os objetos do sistema, o problema é que o RSpec não conhece todos os objetos do sistema. O expect é uma solução para esse tipo de situação.

Você pode ler mais sobre o expect na documentação do RSpec. Para entender exatamente o problema do should, leia este excelente post.

Subjects aninhados (nested subjects)

Assim como em métodos normais do Ruby, é possível utilizar a keyword super para fazer overriding nos blocos subjectlet e let!:

Uma observação importante é que você deve utilizar os parênteses () ao invocar super. Do contrário, você receberá um RuntimeError:

Described class

Ao descrever uma classe, o RSpec disponibiliza o método described_class, que retorna a classe que a spec descreve. Você pode utilizá-lo, por exemplo, para criar novas instâncias dessa mesma classe:

Isso facilita um futuro refactoring, evitando que você tenha que escrever o nome da classe por todo lado.

Specify

O RSpec possui alguns métodos para descrição de specs. Os mais conhecidos são itdescribe econtext. Há, além desses, o specify:

Funcionalmente não há nenhuma diferença entre it e specify. O último é apenas um alias para o primeiro e seu uso deve ser feito com o objetivo de deixar as specs mais expressivas e legíveis.

Its

Outro método útil para deixar as specs mais expressivas é o its. Ele pode ser utilizado ao descrever objetos de retorno:

Ele suporta, ainda, coisas como nested attributes:

E Hashes:

Satisfy

satisfy é um dos matchers mais flexíveis disponíveis no RSpec. Ele aceita um bloco e espera que o retorno seja true para um teste executado com sucesso:

O único problema é que a mensagem de saída é algo como “expected something to satisfy block”, ou seja, não é muito clara.

Nota: Este post foi originalmente publicado no blog do autor: https://lenonmarcel.com.br/