Как запустить один тест RSpec? - PullRequest
280 голосов
/ 25 мая 2011

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

/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

Файл спецификации:

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

Ответы [ 13 ]

448 голосов
/ 25 мая 2011

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

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

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

EDIT1:

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

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

Попробуйте:

bundle exec rspec ./spec/controllers/groups_controller_spec.rb:42
65 голосов
/ 08 августа 2012

с рейком:

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\""
57 голосов
/ 25 мая 2011

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

spec path/to/my_spec.rb -e "should be the correct answer"
24 голосов
/ 04 июня 2014

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

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 голосов
/ 21 октября 2011

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

  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 запускается и запускает все тесты как обычно.

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

6 голосов
/ 16 июня 2015

@ 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] в зависимости от того, насколько вложенным является тестовый пример.

3 голосов
/ 10 февраля 2019

Не уверен, как долго это будет доступно, но есть конфигурация 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

3 голосов
/ 16 декабря 2016

В рельсах 5,

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

rails test -n /TopicsControllerTest/ -v

Имя класса можно использовать для соответствия желаемому файлуTopicsControllerTest

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

Вывод:

enter image description here

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

rails test -n /TopicsControllerTest#test_Should_delete/ -v
1 голос
/ 21 декабря 2016

Для модели будет запускаться регистр только в строке № 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 
1 голос
/ 04 ноября 2016

начиная с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...