Как запустить один тест RSpec?

306

У меня есть следующий файл:

/spec/controllers/groups_controller_spec.rb

Какую команду в терминале я использую для запуска только этой спецификации и в каком каталоге я запускаю команду?

Мой драгоценный файл:

# Test ENVIRONMENT GEMS
group :development, :test do
    gem "autotest"
    gem "rspec-rails", "~> 2.4"
    gem "cucumber-rails", ">=0.3.2"
    gem "webrat", ">=0.7.2"
    gem 'factory_girl_rails'
    gem 'email_spec'
end

Spec файл:

require 'spec_helper'

describe GroupsController do
  include Devise::TestHelpers

  describe "GET yourgroups" do
    it "should be successful and return 3 items" do

      Rails.logger.info 'HAIL MARRY'

      get :yourgroups, :format => :json
      response.should be_success
      body = JSON.parse(response.body)
      body.should have(3).items # @user1 has 3 permissions to 3 groups
    end
  end
end
AnApprentice
источник
Вы можете запустить свои тесты, такие как bundle exec rspec ./spec/controllers/groups_controller_spec.rb:6, он запускает только этот конкретный тест. Более подробная информация здесь: kolosek.com/rails-rspec-setup
Неша Зорич
bundle exec rspec spec --helpдадим вам ответ:
Томас Деко

Ответы:

15

Не уверен, как долго это будет доступно, но есть конфигурация Rspec для фильтрации выполнения - так что теперь вы можете добавить это к вашему spec_helper.rb:

RSpec.configure do |config|
  config.filter_run_when_matching :focus
end

А затем добавить фокус тег к it, contextили describeзапустить только этот блок:

it 'runs a test', :focus do
  ...test code
end

Документация RSpec:

https://www.rubydoc.info/github/rspec/rspec-core/RSpec/Core/Configuration#filter_run_when_matching-instance_method

эмс
источник
1
Это требует изменения инфраструктуры. И не забывая поменять его обратно. Я бы порекомендовал не делать этого и использовать только rspecкоманды для запуска спецификации с соответствующим параметром, чтобы указать, какой
Майкл Даррант
482

Обычно я делаю:

rspec ./spec/controllers/groups_controller_spec.rb:42

Где 42представляет строку теста, который я хочу выполнить.

EDIT1:

Вы также можете использовать теги. Смотрите здесь .

РЕДАКТИРОВАТЬ 2:

Пытаться:

bundle exec rspec ./spec/controllers/groups_controller_spec.rb:42
apneadiving
источник
Спасибо, пробовал, что он не работает, когда я делаю рейк spec /spec/path...:XX я получаю ошибку /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby -S bundle exec rspec ./spec/controllers/groups_controller_spec.rb ./spec/controllers/incoming_mails_controller_spec.rb ./spec/lib/mailing_job/mailingjob_find_reply_spec.rb ./spec/models/group_model_spec.rb ./spec/models/user_model_spec.rb
AnApprentice
Если я пытаюсь использовать только RSPEC, я получаю эту ошибку: "$ rspec spec / controllers / groups_controller_spec.rb: 19 /Library/Ruby/Gems/1.8/gems/bundler-1.0.0/lib/bundler/runtime.rb:27 : in `setup ': вы уже активировали rspec-core 2.6.2, но ваш Gemfile требует rspec-core 2.6.0. Рассмотрите возможность использования комплекта exec. (Gem :: LoadError)"
AnApprentice
В этом случае вы можете попробовать "bundle exec rspec spec / controllers / groups_controller_spec.rb: 19"
muffinista
Bundle Exec работал, но почему? Это какой-то хак, чтобы избежать этого?
AnApprentice
11
это не хак, он гарантирует, что вы используете ту же версию, которую вы объявили в своем gemfile. В вашем случае просто произошел rspecсбой, потому что версия в вашей системе более поздняя, ​​чем в вашем gemfile.
апреля
67

С граблями:

rake spec SPEC=path/to/spec.rb

(Кредит идет к этому ответу . Идите и проголосуйте за него.)

РЕДАКТИРОВАТЬ (спасибо @cirosantilli): чтобы запустить один конкретный сценарий в спецификации, вы должны указать соответствие шаблону регулярного выражения, соответствующее описанию.

rake spec SPEC=path/to/spec.rb \
          SPEC_OPTS="-e \"should be successful and return 3 items\""
Грант Бирчмейер
источник
11
Это лучший ответ, потому что он использует команду 'rake spec', а не 'rspec'. Это означает, что тестовая база данных правильно каждый раз заново инициализируется (что не происходит, если вы используете 'rspec ...')
jpw
Вы можете использовать SPEC=path/to/spec.rb:42для запуска теста по заданному номеру строки, хотя кажется, что любые it_behaves_likeтесты также будут запущены (ошибка?).
mgold
61

Вы можете передать регулярное выражение в команду spec, которая будет запускать только itблоки, совпадающие с указанным вами именем.

spec path/to/my_spec.rb -e "should be the correct answer"

2019 Обновление: Rspec2 переключен с команды spec на команду rspec.

Дуглас Ф Ширер
источник
Спасибо, я пытался это сделать, но он выдает ошибки: $ rake spec spec / controllers /coming_mails_controller_spec.rb -e "должно быть успешно и вернуть 3 элемента" рейк прерван! (eval): 1: в `standard_rake_options ': ошибка компиляции (eval): 1: синтаксическая ошибка, неожиданный tIDENTIFIER, ожидается, что $ end должен быть успешным и вернуть 3 элемента
AnApprentice
Обновлено с актуальными идеями файла спецификации?
Ученик
Если у вас есть ошибка компиляции, ваша спецификация не является допустимой ruby. Убедитесь , что вы не пропуская ни doпосле it, contextили describeдекларации.
Дуглас Ф. Ширер
1
Это «спек», а не «рейк спек».
Маффиниста
это должен быть правильный ответ, относящийся к номеру строки серьезно неверно - в любом случае
Eugen Mayer
27

Есть много вариантов:

rspec spec                           # All specs
rspec spec/models                    # All specs in the models directory
rspec spec/models/a_model_spec.rb    # All specs in the some_model model spec
rspec spec/models/a_model_spec.rb:nn # Run the spec that includes line 'nn'
rspec -e"text from a test"           # Runs specs that match the text
rspec spec --tag focus               # Runs specs that have :focus => true
rspec spec --tag focus:special       # Run specs that have :focus => special
rspec spec --tag focus ~skip         # Run tests except those with :focus => true
Майкл Даррант
источник
23

Мой предпочтительный метод для запуска определенных тестов немного отличается - я добавил строки

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

К моему файлу spec_helper.

Теперь, когда я хочу запустить один конкретный тест (или контекст, или спецификацию), я могу просто добавить к нему тег «focus» и запускать свой тест как обычно - будут выполняться только сфокусированные тесты. Если я удаляю все теги фокуса, run_all_when_everything_filteredзапускается и запускает все тесты как обычно.

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

GlyphGryph
источник
Я определенно предпочитаю этот стиль, потому что я обычно запускаю тесты через Rubymine / intelliJ. Мне нравится этот метод еще и потому, что он похож на использование fit / xit в жасмине / с
gulp
9

@apneadiving answer - отличный способ решить эту проблему. Однако теперь у нас есть новый метод в Rspec 3.3. Мы можем просто запустить rspec spec/unit/baseball_spec.rb[#context:#it]вместо использования номера строки. Взято отсюда:

В RSpec 3.3 представлен новый способ идентификации примеров [...]

Например, эта команда:

$ rspec spec/unit/baseball_spec.rb[1:2,1:4] … Будет запускать 2-й и 4-й пример или группу, определенную в 1-й группе верхнего уровня, определенной в spec / unit / baseball_spec.rb.

Таким образом, вместо того, чтобы выполнять rspec spec/unit/baseball_spec.rb:42там, где это (тест в строке 42), является первым тестом, мы можем просто выполнить rspec spec/unit/baseball_spec.rb[1:1]или в rspec spec/unit/baseball_spec.rb[1:1:1]зависимости от того, насколько вложенным является тестовый пример.

Инго
источник
5

В рельсах 5,

Я использовал этот способ для запуска одного файла теста (все тесты в одном файле)

rails test -n /TopicsControllerTest/ -v

Имя класса может использоваться, чтобы соответствовать желаемому файлу TopicsControllerTest

Мой класс class TopicsControllerTest < ActionDispatch::IntegrationTest

Вывод :

введите описание изображения здесь

Если хотите, вы можете настроить регулярное выражение для соответствия методу одного теста \TopicsControllerTest#test_Should_delete\

rails test -n /TopicsControllerTest#test_Should_delete/ -v
Alupotha
источник
4

Для модели он будет запускать регистр только в строке № 5

bundle exec rspec spec/models/user_spec.rb:5

Для контроллера: он будет запускать регистр только в строке № 5

bundle exec rspec spec/controllers/users_controller_spec.rb:5

Для модели сигнала или контроллера уберите номер строки сверху

Чтобы запустить дело на всех моделях

bundle exec rspec spec/models

Запустить кейс на весь контроллер

bundle exec rspec spec/controllers

Запустить все дела

 bundle exec rspec 
Сандип Капил
источник
3

Запустите команды из корневого каталога вашего проекта:

# run all specs in the project's spec folder
bundle exec rspec 

# run specs nested under a directory, like controllers
bundle exec rspec spec/controllers

# run a single test file
bundle exec rspec spec/controllers/groups_controller_spec.rb

# run a test or subset of tests within a file
# e.g., if the 'it', 'describe', or 'context' block you wish to test
# starts at line 45, run:
bundle exec rspec spec/controllers/groups_controller_spec.rb:45
Allison
источник
1

начиная с rspec 2 вы можете использовать следующее:

# in spec/spec_helper.rb
RSpec.configure do |config|
  config.filter_run :focus => true
  config.run_all_when_everything_filtered = true
end

# in spec/any_spec.rb
describe "something" do
  it "does something", :focus => true do
    # ....
  end
end
Rudi
источник
0

Учитывая, что вы находитесь на проекте rails 3 с rspec 2, из корневого каталога rails:

  bundle exec rspec spec/controllers/groups_controller_spec.rb 

должно определенно работать. Я устал набирать это, поэтому я создал псевдоним для сокращения «bundle exec rspec» до «bersp»

'bundle exec' таков, что он загружает точное окружение gem, указанное в вашем файле gem: http://gembundler.com/

Rspec2 переключился с команды spec на команду rspec.

MissingHandle
источник
0

Я использую этот защитный камень для автоматического запуска моего теста. Он выполняет тест после создания или обновления операций над тестовым файлом.

https://github.com/guard/guard-test

или обычно вы можете запустить с помощью следующей команды

rspec spec / controllers / groups_controller_spec.rb

Рамешвар Веххаре
источник
0

Вы можете сделать что-то вроде этого:

 rspec/spec/features/controller/spec_file_name.rb
 rspec/spec/features/controller_name.rb         #run all the specs in this controller
Прабхакар Ундурти
источник
0

Ты можешь использовать

 rspec spec/controllers/groups_controller_spec.rb:<line_number>

номер строки должен быть номером строки «описать» или «это», чтобы он выполнял тесты, присутствующие в этом конкретном блоке. вместо этого он выполнит все строки рядом с line_number.

Также вы можете создать блок с произвольным именем и затем выполнять только эти блоки.

Акшай Добал
источник
0

Другая распространенная ошибка - все еще иметь или обновить старое приложение Rails до Rails 5+ и ставить require 'spec_helper'вверху каждого тестового файла. Это должно быть изменено на require 'rails_helper'. Если вы видите различное поведение между rake task ( rake spec) и когда вы запускаете одну spec ( rspec path/to/spec.rb), это общая причина

лучшее решение состоит в том, чтобы

1) убедитесь, что вы используете require 'rails_helper'в верхней части каждого из ваших spec-файлов, а не в старом стиле require 'spec_helper' 2) используйте rake spec SPEC=path/to/spec.rbсинтаксис

на rspec path/to/spec.rbмой взгляд, в 2020 году сообщество должно считать устаревший стиль устаревшим (но, конечно, вы заставите его работать, если не учитывать другие соображения)

Джейсон ФБ
источник