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

#ruby #rspec

#ruby #rspec

Вопрос:

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

Есть ли способ, которым я могу context временно отключить?

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

Это то, что у меня вроде как было:

 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 вызов.

Есть ли альтернатива или я делаю это неправильно?

Ответ №1:

Чтобы отключить дерево спецификаций с помощью 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!

3. По какой-то причине я не могу заставить это работать с rspec 3.

4.использование rspec 3 pending гарантирует, что спецификации не выполнены, но вы можете использовать skip или даже просто xdescribe myronmars.to/n/dev-blog/2014/05 /…

5. Это приятно. Вы также можете включить сообщение после ‘skip’, которое будет отображаться в выходных данных.

Ответ №2:

Использовать фильтры исключения. С этой страницы: В вашем 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 —формат doc»

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

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

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

Ответ №3:

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

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

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

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

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

Комментарии:

1. Также я не уверен, работает ли это так же для describe, но в ожидающем тесте фактически выполняется тест и завершается неудачей, если тест начинает проходить. xdescribe (я думаю, точно так же, как xit) — просто не запускает его.

2. подтвердил, что это работает как с pending: , так и skip: с rspec 3.6.0. Мне кажется, это лучшее решение. в rspec3 в ожидании все еще выполняются тесты, но skip не выполняется (как бы вы ни применяли skip ).

Ответ №4:

еще один. 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, amp;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 
  

Ответ №5:

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

 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
  

Ответ №6:

 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
  

Ответ №7:

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