Como marcar um bloco it_should_behave_like como pendente

#automated-test, #dev, #ruby

tl;dr

Use algo como:

context "something", pending: true do
  it_should_behave_like "an unauthorized controller" do
    before { post :execute, something: params }
  end
end

Como vocês viram no post Criando métodos helper no RSpec eu criei um helper para evitar ter que digitar o mesmo código várias vezes, basicamente sendo DRY.

Existem vários jeitos no RSpec para evitar duplicação de código, um deles é usando o it_should_behave_like.

Para exemplificar eu tenho esse trecho de cógido:

shared_examples_for "an unauthorized controller" do
  it "should return correct error message" do
    expect(json_response["errors"][0]["message"]).to eq "Not authorized"
  end
end

E eu posso chamar assim:

it_should_behave_like "an unauthorized controller" do
  before { post :execute, something: params }
end

É possível ter vários it. No meu caso que eu também verifico o código de retorno da requisição.

Porém um dos controllers não estava retornando nem a mensagem nem o código de erro correto.

O que fazer então?

  • Marcar como pendente?
  • Comentar as linhas? ou
  • Não adicionar o código?

Não colocar essa chamada ao it_should_behave_like não me parece certo. A probabilidade de nunca ninguém voltar para corrigir isso é muito maior.

Colocar o código comentado com um FIXME me parece menos errado, mas mesmo assim a probabilidade de que alguém nunca volte para corrigir também é grande.

E outro dois fatores que me fazem usar blocos pendentes no RSpec são:

  • Alertar que determinado teste precisa ser finalizado;
  • Se por algum motivo o teste volta a passar o RSpec emite um alerta.

Eu não vejo problema em a build demorar um pouco mais rodando teste pendente se eu vou receber um alerta de que aquele código foi corrigido.

A solução que encontrei foi marcando todo o context como pendente, no exemplo ficaria algo como:

context "when it is a regular API controller", pending: true do
  it_should_behave_like "an unauthorized controller" do
    before { post :execute, something: params }
  end
end

Lembre-se: nesse caso se o teste voltar a passar a sua build vai quebrar.

Referências