Как запустить только определенные тесты в Rspec?

159

Я думаю, что есть способ запустить только тесты с данным ярлыком. Кто-нибудь знает?

Натан Лонг
источник

Ответы:

186

Найти документацию непросто, но вы можете пометить примеры хешем. Например.

# spec/my_spec.rb
describe SomeContext do
  it "won't run this" do
    raise "never reached"
  end

  it "will run this", :focus => true do
    1.should == 1
  end
end

$ rspec --tag focus spec/my_spec.rb

Больше информации на GitHub . (кто-нибудь с лучшей ссылкой, пожалуйста, сообщите)

(Обновить)

RSpec теперь великолепно задокументирован здесь . Подробности смотрите в разделе опции --tag .

Начиная с версии 2.6, этот тип тегов можно выразить еще проще, включив параметр конфигурации treat_symbols_as_metadata_keys_with_true_values, который позволяет выполнять следующие действия:

describe "Awesome feature", :awesome do

где :awesomeрассматривается как если бы это было:awesome => true .

Также смотрите этот ответ, чтобы узнать, как настроить RSpec для автоматического запуска «сфокусированных» тестов. Это особенно хорошо работает с гвардией .

изыскание
источник
Так что вам не придется идти поиск, прямая ссылка на предложение ищущего находится здесь (для Rspec 2.12) relishapp.com/rspec/rspec-core/v/2-12/docs/command-line/...
tir38
Мы добавили спецификацию в наш пакет, чтобы гарантировать, что код никогда не будет объединен с фокусом: true все еще в контроле исходного кода. gist.github.com/jwg2s/7361603
jwg2s
@ jwg2s Я использую ловушку git для блокировки коммитов :focus, что также предотвращает проникновение нежелательных сообщений, таких как 'binding.pry , console.log` и т. д., в базу кода.
Zetetic
1
@ Отеус нет, я просто фанат :) Мне действительно нравится то, что они делали на Relish, но SO просто запустил свою собственную функцию документации, так что мы можем увидеть некоторую конкуренцию.
Zetetic
1
Может быть, вы можете указать мне путь документации, которая фактически описывает использование и реальное поведение rspecпрограммы :) Потому что Relish doc нет.
Отей
111

Вы можете запустить все тесты, которые содержат определенную строку, с опцией --example (или -e) :

rspec spec/models/user_spec.rb -e "User is admin"

Я использую это больше всего.

Ян Минарик
источник
90

В вашем spec_helper.rb:

RSpec.configure do |config|
    config.filter_run focus: true
    config.run_all_when_everything_filtered = true
end

а потом по твоим характеристикам:

it 'can do so and so', focus: true do
    # This is the only test that will run
end

Вы также можете сфокусировать тесты с помощью 'fit' или исключить с помощью 'xit', например так:

fit 'can do so and so' do
    # This is the only test that will run
end
Том Чапин
источник
1
В rspec 3.5 это работает, config.filter_run_when_matchingи это может сработать, просто добавив :focusк примеру
Али Ганаватян
4
Если 'focus: true' случайно зафиксирован, ваш CI будет проходить, несмотря на то, что большинство тестов не выполнялось.
З
67

в качестве альтернативы вы можете передать номер строки: rspec spec/my_spec.rb:75- номер строки может указывать на одну спецификацию или блок контекста / описания (запуск всех спецификаций в этом блоке)

Алекс Ланг
источник
50

Вы также можете записать несколько номеров строк вместе с двоеточием:

$ rspec ./spec/models/company_spec.rb:81:82:83:103

Вывод:

Run options: include {:locations=>{"./spec/models/company_spec.rb"=>[81, 82, 83, 103]}}
Джонатон Бэтсон
источник
Это так золото! I
iGbanam
28

По состоянию на RSpec 2.4 (я думаю) вы можете предварять fили xк it, specify, describeи context:

fit 'run only this example' do ... end
xit 'do not run this example' do ... end

http://rdoc.info/github/rspec/rspec-core/RSpec/Core/ExampleGroup#fit-class_method http://rdoc.info/github/rspec/rspec-core/RSpec/Core/ExampleGroup#xit-class_method

Обязательно иметь config.filter_run focus: trueи config.run_all_when_everything_filtered = trueв своем spec_helper.rb.

Джошуа Мухайм
источник
5

В новых версиях RSpec еще проще настроить поддержку fit:

# spec_helper.rb

# PREFERRED
RSpec.configure do |c|
  c.filter_run_when_matching :focus
end

# DEPRECATED
RSpec.configure do |c|
  c.filter_run focus: true
  c.run_all_when_everything_filtered = true
end

Видеть:

https://relishapp.com/rspec/rspec-core/docs/filtering/filter-run-when-matching

https://relishapp.com/rspec/rspec-core/v/3-7/docs/configuration/run-all-when-everything-filtered

jwfearn
источник
3

Также вы можете запустить спецификации, которые focus: trueпо умолчанию

спецификации / spec_helper.rb

RSpec.configure do |c|
  c.filter_run focus: true
  c.run_all_when_everything_filtered = true
end

Тогда просто беги

$ rspec

и будет выполняться только сфокусированный тест

затем, когда вы удалите focus: trueвсе тесты, хорошо запустить снова

Дополнительная информация: https://www.relishapp.com/rspec/rspec-core/v/2-6/docs/filtering/inclusion-filters

itsnikolay
источник
Является ли spec/spec_helper.rbвсегда включен? Или только если вариантов не дано? Почему у тестовых модулей есть require 'spec_helber'и не имеет ли приведенный выше код возможность исключить возможность выполнения одного теста, указав файл? Я не могу найти документацию по этому вопросу.
Отей
1
spec_helper.rbвсегда включается , если у вас есть --require spec_helperв .rspecв корневом каталоге проекта.
Крис
1

Вы можете запустить как rspec spec/models/user_spec.rb -e "SomeContext won't run this".

Авиджит Маджхи
источник