Я нашел все виды ссылок в Интернете, но ни один из них не является текущим и показывает, как запускать один тест.
У меня есть следующий файл:
/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
Обычно я делаю:
rspec ./spec/controllers/groups_controller_spec.rb:42
Где 42
представляет строку теста, который я хочу запустить.
EDIT1:
Вы также можете использовать теги. См. здесь.
ИЗМЕНИТЬ 2:
Try:
bundle exec rspec ./spec/controllers/groups_controller_spec.rb:42
С 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\""
SPEC=path/to/spec.rb:42
чтобы запустить тест по заданному номеру строки, хотя кажется, что любые it_behaves_like
тесты также будут запущены (ошибка?).
Вы можете передать регулярное выражение в команду 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.
Теперь, когда я хочу запустить один конкретный тест (или контекст или спецификацию), я могу просто добавить к нему тег "focus" и запустить свой тест как обычно - будут выполняться только те тесты, которые были сфокусированы. Если я удалю все теги фокуса, 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]
... будет запускать второй и четвертый пример или группу, определенные в первой группе верхнего уровня, определенной в 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
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 test -n /TopicsControllerTest/ -v
Имя класса может использоваться для соответствия требуемому файлу TopicsControllerTest
Мой класс class TopicsControllerTest < ActionDispatch::IntegrationTest
Выход:
Если вы хотите, вы можете настроить регулярное выражение в соответствии с единственным методом тестирования \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
Существует жемчужина watchr ', которая может отслеживать любое изменение кода в файле и автоматически запускать тест для вас
Вы можете сделать что-то вроде этого:
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/контроллеры/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".
bundle exec rspec spec --help
даст вам ответ: