Отключить группу тестов в rspec?

104

У меня есть тестовая спецификация, в которой describesкласс и внутри него разные, contextsкаждый с различными itблоками.

Есть ли способ contextвременно отключить ?

Я попытался добавить pending "temporarily disabled"вызов в самом верху в том, что contextя хочу отключить, и я увидел что-то ожидающее, когда я запускал спецификацию, но затем он просто продолжал запускать остальные тесты.

Вот что у меня было:

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

но, как я уже сказал, он просто запустил тесты под ожидающим вызовом.

Поиск привел меня к этой ветке списка рассылки, в которой создатель (?) Rspec говорит, что это возможно в rspec 2, которым я пользуюсь. Думаю, это сработало, но не дало желаемого эффекта в виде отключения всех следующих тестов, о чем я думаю, когда вижу pendingзвонок.

Есть альтернатива или я не так делаю?

Хорхе Исраэль Пенья
источник

Ответы:

167

Чтобы отключить дерево спецификаций с помощью RSpec 3, вы можете:

before { skip }
# or 
xdescribe
# or 
xcontext

Вы можете добавить сообщение с пропуском, которое будет отображаться в выводе:

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

с RSpec 2 :

before { pending }
Поджигатель
источник
1
Как именно это сделать в блоке, в котором есть:describe 'XXXXX' do .... end
Матсинопулос,
2
@ p.matsinopoulos Просто добавьте его в следующую строку describe 'XXXXX' do. Сработал как шарм, спасибо @Pyro!
chesterbr
Более
простое
Я тебя люблю. Я должен тебе пива!
Aldo 'xoen' Giambelluca
2
Это хорошо. Вы также можете включить сообщение после «пропустить», которое будет отображаться в выводе.
Jan Hettich
44

Используйте фильтры исключения . С этой страницы: В вашем spec_helper.rb(или rails_helper.rb)

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

В вашем тесте:

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

Когда я запускаю "rspec ./spec/sample_spec.rb --format doc"

Тогда вывод должен содержать «группа 2, пример 1».

И вывод не должен содержать «группа 1, пример 1».

И вывод не должен содержать «группа 1, пример 2».

Роберт Спайчер
источник
19

Посмотрите, что вы об этом думаете:

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

Когда я отключаю что-то «на время», мне нравится видеть причины с моими отложенными элементами. Они служат небольшими комментариями / TODO, которые представляются регулярно, а не скрываются в комментариях или исключенном примере / файле.

Переход itна pendingили xitвыполняется быстро и легко, но я предпочитаю хэш-конструкцию. Он предоставляет вам документацию по каждому запуску, является добавляемым (не меняет description / context / it, поэтому я должен решить, что использовать снова позже), и так же легко удаляется, если решение принято или блокировщик удален. .

Это работает одинаково для групп и отдельных примеров.

ботаймер
источник
Также я не уверен, работает ли он так же для описания, но в ожидании действительно запускает тест и терпит неудачу, если тест начинает проходить. Xdescribe (я думаю, как и xit) - просто не запускает его.
PL J
1
подтвердил, что это работает как с, так pending:и skip:с rspec 3.6.0. Мне кажется, это лучшее решение. в ожидании rspec3 все еще запускает тесты, но skipнет (однако вы применяетеskip ).
jrochkind
9

другой. https://gist.github.com/1300152

используйте xdescribe, xcontext, xit, чтобы отключить его.

Обновить:

Начиная с rspec 2.11, он по умолчанию включает xit. так что новый код будет

# 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

использование

# a_spec.rb
xdescribe "padding" do
  it "returns true" do
    1.should == 1
   end
end 
GutenYe
источник
3

Используйте ожидание вместо описания. Если ваш блок:

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

Вы можете пропустить весь блок:

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

Просто чтобы объяснить, что происходит с вашим кодом. Включая его там, где он есть, он просто оценивается (и, следовательно, запускается), когда файл загружается во время запуска. Однако вам нужно, чтобы он запускался при запуске тестов. Вот почему в ответах предлагалось поместить pending(RSpec 2) или skip(RSpec 3) в beforeблок.

PhilT
источник