Désactiver un groupe de tests dans rspec?

103

J'ai une spécification de test dans laquelle describesune classe et à l'intérieur de cela a divers contextschacun avec différents itblocs.

Existe-t-il un moyen de désactiver contexttemporairement un ?

J'ai essayé d'ajouter un pending "temporarily disabled"appel tout en haut dans un contextJe veux désactiver, et j'ai vu quelque chose à propos de l'attente lorsque j'ai exécuté la spécification, mais il a continué à exécuter le reste des tests.

C'est ce que j'avais en quelque sorte:

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

mais comme je l'ai dit, il a simplement continué à exécuter les tests sous l'appel en attente.

La recherche m'a conduit à ce fil de discussion de liste de diffusion dans lequel le créateur (?) De rspec dit que c'est possible dans rspec 2, que j'exécute. Je suppose que cela a fonctionné, mais cela n'a pas eu l'effet souhaité de désactiver tous les tests suivants, ce à quoi je pense quand je vois un pendingappel.

Y a-t-il une alternative ou est-ce que je le fais mal?

Jorge Israel Peña
la source

Réponses:

166

Pour désactiver une arborescence de spécifications à l'aide de RSpec 3, vous pouvez:

before { skip }
# or 
xdescribe
# or 
xcontext

Vous pouvez ajouter un message avec skip qui apparaîtra dans la sortie:

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

avec RSpec 2 :

before { pending }
Pyro
la source
1
Comment faire exactement cela sur un bloc qui a:describe 'XXXXX' do .... end
p.matsinopoulos
2
@ p.matsinopoulos Ajoutez-le simplement à la ligne suivante describe 'XXXXX' do. A travaillé comme un charme, merci @Pyro!
chesterbr
Solution plus simple que les filtres, +1
dolzenko
Je t'aime. Je te dois une bière!
Aldo 'xoen' Giambelluca
2
C'est sympa. Vous pouvez également inclure un message après «sauter» qui apparaîtra dans la sortie.
Jan Hettich
44

Utilisez des filtres d'exclusion . À partir de cette page: dans votre spec_helper.rb(ou rails_helper.rb)

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

Dans votre test:

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

Quand je lance "rspec ./spec/sample_spec.rb --format doc"

Ensuite, la sortie doit contenir "exemple 1 du groupe 2"

Et la sortie ne doit pas contenir "exemple 1 du groupe 1"

Et la sortie ne doit pas contenir "groupe 1 exemple 2"

Robert Speicher
la source
19

Voyez ce que vous en pensez:

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

J'aime voir les raisons de mes éléments en attente lorsque je désactive quelque chose pendant "un certain temps". Ils servent de petits commentaires / TODO qui sont présentés régulièrement plutôt qu'enterrés dans un commentaire ou un exemple / fichier exclu.

Changer iten pendingou xitest rapide et facile, mais je préfère la construction de hachage. Il vous donne une documentation à chaque exécution, est une liste déroulante (ne change pas la description / le contexte / il faut donc que je décide quoi utiliser à nouveau plus tard), et est tout aussi facilement supprimé si la décision est prise ou si le bloqueur est supprimé .

Cela fonctionne de la même manière pour les groupes et les exemples individuels.

botimer
la source
De plus, je ne suis pas sûr que cela fonctionne de la même manière pour describe, mais dans le dernier cas en attente, exécute réellement le test et échoue si le test commence à réussir. Le xdescribe (je suppose, tout comme xit) - ne l'exécute tout simplement pas.
PL J
1
a confirmé que cela fonctionne, avec les deux pending:et skip:, dans rspec 3.6.0. Cela me semble être la meilleure solution. dans rspec3 pending exécute toujours les tests, mais skipne le fait pas (cependant vous appliquez le skip).
jrochkind
9

un autre. https://gist.github.com/1300152

utilisez xdescribe, xcontext, xit pour le désactiver.

Mettre à jour:

Depuis rspec 2.11, il inclut xit par défaut. donc le nouveau code sera

# 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

Usage

# a_spec.rb
xdescribe "padding" do
  it "returns true" do
    1.should == 1
   end
end 
GutenYe
la source
3

Utilisez en attente au lieu de décrire. Si votre blocage est:

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

Vous pouvez ignorer tout le bloc en:

pending "some other tests" do
  it "should do something destructive" do
    blah
  end
end
Amir Samakar
la source
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
Mat
la source
0

Juste pour expliquer ce qui se passe avec votre code. En l'incluant là où vous l'avez, il est simplement évalué (et donc exécuté) lorsque le fichier est chargé au démarrage. Cependant, vous en avez besoin pour l'exécuter lors de l'exécution des tests. C'est pourquoi les réponses ont suggéré de mettre pending(RSpec 2) ou skip(RSpec 3) dans un beforebloc.

PhilT
la source