Desativar um grupo de testes em rspec?


102

Eu tenho uma especificação de teste em que describesuma classe e dentro dela tem vários, contextscada um com vários itblocos.

Existe uma maneira de desativar contexttemporariamente?

Eu tentei adicionar uma pending "temporarily disabled"chamada bem no topo dentro de um contextdesejo desabilitar, e eu vi algo sobre pendente quando executei a especificação, mas ele simplesmente continuou a executar o restante dos testes.

Isso é o que eu meio que tinha:

describe Something
  context "some tests" do
    it "should blah" do
      true
    end
  end

  context "some other tests" do
    pending "temporarily disabled"

    it "should do something destructive" do
      blah
    end
  end
end

mas, como eu disse, ele apenas passou a executar os testes da chamada pendente.

Pesquisas me levaram a este tópico da lista de discussão em que o criador (?) Do rspec diz que é possível no rspec 2, que estou executando. Acho que funcionou, mas não teve o efeito desejado de desativar todos os testes a seguir, que é o que penso quando vejo uma pendingchamada.

Existe uma alternativa ou estou fazendo errado?

Respostas:


165

Para desativar uma árvore de especificações usando RSpec 3, você pode:

before { skip }
# or 
xdescribe
# or 
xcontext

Você pode adicionar uma mensagem com salto que aparecerá na saída:

before { skip("Awaiting a fix in the gem") }

com RSpec 2 :

before { pending }

1
Como você faz isso exatamente em um bloco que tem:describe 'XXXXX' do .... end
p.matsinopoulos

2
@ p.matsinopoulos Basta adicioná-lo à linha seguinte describe 'XXXXX' do. Funcionou como um encanto, obrigado @Pyro!
chesterbr

Solução mais simples do que filtros, +1
dolzenko

Eu te amo. Eu lhe devo uma cerveja!
Aldo 'xoen' Giambelluca

2
Isso é legal. Você também pode incluir uma mensagem após 'ignorar' que aparecerá na saída.
Jan Hettich

44

Use filtros de exclusão . A partir dessa página: Em seu spec_helper.rb(ou rails_helper.rb)

RSpec.configure do |c|
  c.filter_run_excluding :broken => true
end

Em seu teste:

describe "group 1", :broken => true do
  it "group 1 example 1" do
  end

  it "group 1 example 2" do
  end
end

describe "group 2" do
  it "group 2 example 1" do
  end
end

Quando executo "rspec ./spec/sample_spec.rb --format doc"

Então, a saída deve conter "grupo 2 exemplo 1"

E a saída não deve conter "grupo 1 exemplo 1"

E a saída não deve conter "grupo 1 exemplo 2"


19

Veja o que você acha disso:

describe "something sweet", pending: "Refactor the wazjub for easier frobbing" do
  it "does something well"
  it "rejects invalid input"
end

Eu gosto de ver os motivos dos meus itens pendentes quando estou desabilitando algo por "um tempo". Eles servem como pequenos comentários / TODOs que são apresentados regularmente, em vez de incluídos em um comentário ou em um exemplo / arquivo excluído.

Alterar itpara pendingou xité rápido e fácil, mas prefiro a construção hash. Ele fornece a documentação de cada execução, é uma opção (não muda a descrição / contexto /, então eu tenho que decidir o que usar novamente mais tarde), e é facilmente removido se a decisão for tomada ou o bloqueador for removido .

Isso funciona da mesma forma para grupos e exemplos individuais.


Além disso, não tenho certeza se funciona da mesma forma para o describe, mas no pendente realmente executa o teste e falha se o teste começar a passar. O xdescribe (acho que assim como o xit) - simplesmente não o executa.
PL J

1
confirmou que isso funciona, com pending:e skip:, no rspec 3.6.0. Parece ser a melhor solução para mim. em rspec3 pendente ainda executa testes, mas skipnão (no entanto você aplica o skip).
jrochkind

9

outro. https://gist.github.com/1300152

use xdescribe, xcontext, xit para desativá-lo.

Atualizar:

Desde rspec 2.11, ele inclui xit por padrão. então o novo código será

# put into spec_helper.rb
module RSpec
  module Core
    module DSL
      def xdescribe(*args, &blk)
        describe *args do
          pending 
        end
      end

      alias xcontext xdescribe
    end
  end
end

Uso

# a_spec.rb
xdescribe "padding" do
  it "returns true" do
    1.should == 1
   end
end 

3

Use pendente em vez de descrever. Se o seu bloqueio for:

context "some other tests" do
  it "should do something destructive" do
    blah
  end
end

Você pode pular todo o bloco:

pending "some other tests" do
  it "should do something destructive" do
    blah
  end
end

1
describe "GET /blah" do

  before(:each) { pending "Feature to be implemented..." }

  it { expect(page).to have_button("Submit") }
  it { expect(page).to have_content("Blah") }
end

0

Apenas para explicar o que está acontecendo com seu código. Incluindo-o onde você o fez, ele apenas é avaliado (e, portanto, executado) quando o arquivo é carregado durante a inicialização. No entanto, você precisa que ele seja executado quando os testes forem executados. É por isso que as respostas sugeriram colocar pending(RSpec 2) ou skip(RSpec 3) em um beforebloco.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.