Как запустить один тест 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:
Вы также можете использовать теги. Смотрите здесь.
РЕДАКТИРОВАТЬ 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 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
Мой предпочтительный метод для запуска определенных тестов немного отличается - я добавил строки
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
запускает и запускает все тесты как обычно.
Это не так быстро и просто, как параметры командной строки - для этого требуется отредактировать файл для теста, который вы хотите запустить. Но это дает вам гораздо больше контроля, я чувствую.
Не уверен, как долго это будет доступно, но есть конфигурация 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
Выполните команды из корневого каталога вашего проекта:
# 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
@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.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]
в зависимости от того, насколько вложенным является контрольный пример.
Для единственного примера файла спецификации вам нужно добавить номер строки в последнюю очередь, например
rspec spec/controllers/api/v1/card_list_controller_spec.rb:35
Для одного файла вы можете указать путь к файлу, например
rspec spec/controllers/api/v1/card_list_controller_spec.rb
Для примера полного Rspec в папке spec вы можете попробовать с помощью этой команды
bundle exec rspec spec
Для модели он будет запускать регистр только в строке № 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
В рельсах 5,
Я использовал этот способ для запуска одного файла теста (все тесты в одном файле)
rails test -n /TopicsControllerTest/ -v
Имя класса может использоваться, чтобы соответствовать желаемому файлу TopicsControllerTest
Мои занятия class TopicsControllerTest < ActionDispatch::IntegrationTest
Выход:
Если хотите, вы можете настроить регулярное выражение так, чтобы оно соответствовало методу одного теста. \TopicsControllerTest#test_Should_delete\
rails test -n /TopicsControllerTest#test_Should_delete/ -v
Вы можете использовать
rspec spec/controllers/groups_controller_spec.rb:<line_number>
Номер строки должен быть номером строки "описать" или "это", чтобы он запускал тесты, присутствующие в этом конкретном блоке. вместо этого он выполнит все строки рядом с line_number.
также вы можете создать блок с произвольным именем, а затем выполнять только эти блоки.
Начиная с 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
Другая распространенная ошибка - все еще иметь или обновлять старое приложение Rails до Rails 5+ и ставить require 'spec_helper'
вверху каждого тестового файла. Это должно быть изменено наrequire 'rails_helper'
. Если вы видите разное поведение между задачами с граблями (rake spec
) и когда вы запускаете одну спецификацию (rspec path/to/spec.rb
), это частая причина
лучшее решение - это
1) убедитесь, что вы используете require 'rails_helper'
в верхней части каждого из ваших файлов спецификаций - не в старом стиле require 'spec_helper'
2) используйте rake spec SPEC=path/to/spec.rb
синтаксис
старый стиль rspec path/to/spec.rb
Я думаю, что это должно считаться сообществом вышедшим из моды в 2020 году (но, конечно, вы заставите его работать, не говоря уже о других соображениях)
Вы можете сделать что-то вроде этого:
rspec/spec/features/controller/spec_file_name.rb
rspec/spec/features/controller_name.rb #run all the specs in this controller
Я использую этот драгоценный камень для автоматического запуска моего теста. Он выполняет тест после создания или обновления операций над тестовым файлом.
https://github.com/guard/guard-test
или обычно вы можете запустить с помощью следующей команды
rspec spec/controllers/groups_controller_spec.rb
Учитывая, что вы находитесь на проекте 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.