Marcio Trindade

A nova sintaxe do rspec

O Rspec agora possui uma nova sintaxe que ao meu ponto de vista ficou um pouco mais coeso com o que realmente o teste está testando.

Pra configurar é bem simples, basta você setar qual modo deseja usar no seu spec_helper.

spec_helper.rb
RSpec.configure do |config|
  config.expect_with :rspec do |c|
    # c.syntax = [:should, :expect]
    # c.syntax = :should
    c.syntax = :expect
  end
end

Acredito que o código acima é auto explicativo e não se faz necessário explicações.

Vamos agora a um antes e depois dos testes pra ficar mais claro o que realmente mudou:

antes.rspec
foo.should eq(bar)
foo.should_not eq(bar)

# == or != or ===
foo.should == bar
foo.should != bar
foo.should === bar

# =~ or match
"something".should_not =~ /regex/

# =~ for array
[1, 2, 3].should =~ [2, 1, 3]

# comparision
foo.should be < 10
foo.should be <= 10
foo.should be > 10
foo.should be >= 10

# exceptions
lambda{ foo }.should raise_error(BarError)

# change
lambda{ foo }.should change(bar.size).by(1)
depois.rspec
expect(foo).to eq(bar)
expect(foo).to_not eq(bar)

# == or != or ===
expect(foo).to eq(bar)
expect(foo).to_not eq(bar)
expect(foo).to eql(bar)

# =~ or match
expect("something").not_to match(/regex/)

# =~ for array
expect([1, 2, 3]).to match_array([2, 1, 3])

# comparision
expect(foo).to be < 10
expect(foo).to be <= 10
expect(foo).to be > 10
expect(foo).to be >= 10


# exceptions
expect{ foo }.to raise_error(BarError)

# change
expect{ foo }.to change(bar.size).by(1)

Bom estas alterações foram feitas pot conta de legibilidade e principalmente pelo modo como o should era implementado. Ele é praticamente uma injeção de method_missing no Kernel e classes do tipo BasicObject que não tem herança do kernel ficam sem o should. Porém com a solução do expect tudo fica mais limpo e sem injeção de dependências pra todo lado.