rspec é uma gem (library ou biblioteca) entre os mais populares frameworks para a realização de testes automatizados em ruby. Diferente de outras abordagens de teste, o rspec foca em testar comportamentos específicos ao invés de testar somente métodos, ou seja, utiliza a abordagem BDD ou Behaviour Driven Development, em tradução literal, desenvolvimento guiado a comportamentos.

Um matcher no RSpec é um objeto que serve para verificar o comportamento esperado no nosso teste. Ele é usado para montar uma expectation do RSpec de dois modos diferentes:

expect(actual).to matcher(expected)
expect(actual).to_not matcher(expected)

Um exemplo para cada um dos modos de expectation pode ser:

expect(1).to eq(1)
expect(1).to_not eq(2)

Como mencionado na seção anterior, o RSpec vem com muitos built-in matchers para nos ajudar a escrever testes expressivos. Vamos dar uma olhada neles, começando pelos mais básicos, os “be matchers”.

Matchers relacionados a truthy e falsy

Os be matchers servem para você testar se um objeto é avaliado como true ou false. Você pode usá-los do seguinte modo:

# passa se obj é truthy (não nil ou não false)
expect(obj).to be_true  
# passa se obj é falsy (nil ou false)
expect(obj).to be_false
# passa se obj é nil
expect(obj).to be_nil
# passa se obj é truthy (não nil e não false)
expect(obj).to be_truthy

Os matchers de equidade

Os equality matchers servem para verificar se um objeto é igual a outro objeto. Existe mais de um matcher para esse tipo de verificação porque no Ruby existe mais de um modo de checar a equidade entre dois objetos, que são os seguintes

expect(a).to equal(b) # passa se a.equal?(b)
expect(a).to be(b)    # passa se a.equal?(b)
expect(a).to eql(b)   # passa se a.eql?(b)
expect(a).to eq(b)    # passa se a == b

Matchers relacionados a arrays

O RSpec nos oferece alguns matchers específicos para verificação de arrays. O primeiro é o MatchArray. Esse matcher é usado para verificar se um array é “igual” a outro, independente da ordem dos seus elementos. Segue um exemplo de uso desse matcher:

array = [1, 2, 3, 4]
expect(array).to match_array([1, 2, 3, 4])
expect(array).to match_array([4, 3, 2, 1])
expect(array).not_to match_array([1, 2, 3])
expect(array).not_to match_array([1, 2, 3, 4, 5])

Outro matcher relacionado à verificação de arrays é o Include Matcher. Você pode usá-lo para verificar a relação de pertinência entre um ou mais elementos e um determinado array. Segue um exemplo de uso:

array = [1, 2, 3, 4]
expect(array).to include(1)
expect(array).to include(1, 2, 3)
expect(array).to include(1, 2, 3, 4)
expect(array).not_to include(0)
expect(array).not_to include(5)
expect(array).not_to include(5, 6, 7, 8)
expect(array).not_to include([1, 2, 3, 4])

Por fim, existem também os matchers start_with e end_with que servem para verificar se um array começa ou termina com uma sequência de elementos. Segue um exemplo de uso desses array = [1, 2, 3, 4]:

array = [1, 2, 3, 4]
expect(array).to start_with(1)
expect(array).to start_with(1, 2)
expect(array).not_to start_with(2)
expect(array).to end_with(4)
expect(array).to end_with(3, 4)
expect(array).not_to end_with(3)

Matchers relacionados a strings

O RSpec oferece alguns matchers relacionados a strings, sendo que alguns deles são os mesmos usados para verificar arrays. Vamos começar olhando o Match Matcher, que serve para verificar o valor de uma string de acordo com uma expressão regular:

string = "qa ninja"
expect(string).to match(/qa/)
expect(string).to match(/inja/)
expect(string).not_to match(/ka/)
expect(string).not_to match(/qaninja/)

Agora seguem exemplos dos matchers usados por strings e arrays, começando pelo include:

string = "qa ninja"
expect(string).to include("q")
expect(string).to include("qa")
expect(string).to include("qa", "ninja")
expect(string).not_to include("ka")
expect(string).not_to include("ninjas")

Por fim, você também pode usar os matchers start_with e end_with com strings:

string = "qa ninja"
expect(string).to start_with("qa")
expect(string).not_to start_with("ninja")
expect(string).to end_with("ninja")
expect(string).not_to end_with("qa")

Referência: https://relishapp.com/rspec

Enjoy!