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

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

/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

12 ответов


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

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

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

EDIT1:

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

EDIT 2:

попробуй:

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

С Граблями:

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\""

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

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

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

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

в мой файл spec_helper.

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

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


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

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

@apneadiving ответ-это изящный способ решения этой. Однако теперь у нас есть новый метод в 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.рубидий.

поэтому вместо того, чтобы делать 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,

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

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

начиная с 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

для модели, оно побежит случай на линии 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 

учитывая, что вы находитесь на проекте 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".


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

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

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

RSpec spec / контроллеры / groups_controller_spec.rb


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

 rspec/spec/features/controller/spec_file_name.rb
 rspec/spec/features/controller_name.rb         #run all the specs in this controller