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

214

Я нашел все виды ссылок в Интернете, но ни один из них не является текущим и показывает, как запускать один тест.

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

/spec/controllers/groups_controller_spec.rb

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

Мой файл gem:

# 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
  • 0
    Вы можете запустить свои тесты, такие как bundle exec rspec ./spec/controllers/groups_controller_spec.rb:6, он запускает только этот конкретный тест. Больше информации здесь: kolosek.com/rails-rspec-setup
  • 0
    bundle exec rspec spec --help даст вам ответ:
Теги:
rspec
ruby-on-rails-3

13 ответов

351
Лучший ответ

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

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

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

EDIT1:

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

ИЗМЕНИТЬ 2:

Try:

bundle exec rspec ./spec/controllers/groups_controller_spec.rb:42
  • 0
    Спасибо, пробовал, что это не работает, когда я делаю грабли 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_mod_spec.smode.spec
  • 0
    Если я пытаюсь использовать только 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)"
Показать ещё 9 комментариев
55

С Rake:

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 ...')
  • 0
    Вы можете использовать SPEC=path/to/spec.rb:42 чтобы запустить тест по заданному номеру строки, хотя кажется, что любые it_behaves_like тесты также будут запущены (ошибка?).
45

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

spec path/to/my_spec.rb -e "should be the correct answer"
  • 0
    Спасибо, я пытался это сделать, но он выдает ошибки: $ rake spec spec / controllers /coming_mails_controller_spec.rb -e "должно быть успешно и вернуть 3 элемента" рейк прерван! (eval): 1: в `standard_rake_options ': ошибка компиляции (eval): 1: синтаксическая ошибка, неожиданный tIDENTIFIER, ожидается, что $ end должен быть успешным и вернуть 3 элемента
  • 0
    Обновлено с актуальными идеями файла спецификации?
Показать ещё 3 комментария
22

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

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

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

  • 0
    Я определенно предпочитаю этот стиль, потому что я обычно запускаю тесты через Rubymine / intelliJ. Мне нравится этот метод также потому, что он похож на использование Fit / XIT в Жасмин / с глотком
15

Существует много вариантов:

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
2
Ответ на

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

1

Для модели он будет запускать только код строки 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

В рельсах 5,

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

rails test -n /TopicsControllerTest/ -v

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

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

Выход:

Изображение 4160

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

rails test -n /TopicsControllerTest#test_Should_delete/ -v
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
0

Существует жемчужина watchr ', которая может отслеживать любое изменение кода в файле и автоматически запускать тест для вас

0

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

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

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

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню