Как вы запускаете один файл test / spec в RSpec?

282

Я хочу иметь возможность запускать тесты одного файла спецификации - например, для одного файла, который я редактирую. rake specвыполняет все спецификации. Мой проект не является проектом Rails, поэтому rake spec:docне работает.

Не знаю, имеет ли это значение, но вот моя структура каталогов.

./Rakefile
./lib
./lib/cushion.rb
./lib/cushion
./lib/cushion/doc.rb
./lib/cushion/db.rb
./spec
./spec/spec.opts
./spec/spec_helper.rb
./spec/db_spec.rb
Джонатан Тран
источник

Ответы:

392

Или вы можете пропустить рейк и использовать команду rspec:

rspec path/to/spec/file.rb

В вашем случае, я думаю, если ваш файл ./spec/db_spec.rb содержит соответствующих помощников, он должен работать нормально.

Если вы используете старую версию rspec, то это:

spec path/to/spec/file.rb
Кэмерон Бут
источник
31
с новым rspec вы должны использовать «rspec path / to / file.rb»
djburdick
3
Может быть, я делаю это неправильно, но мне нужно сделать «bundle exec rspec path / to / spec / file.rb»
andrhamm
2
Если вы используете Rails, вы, вероятно, захотите выполнить свои спецификации с помощью Rake, чтобы убедиться, что вы начинаете с пустой базы данных.
суперсветовой
@andrhamm, вы просто запускаете свои спецификации в контексте вашей связки. Это необходимо, если вы не используете gemsets (которые поставляются по умолчанию с rvm и являются отдельным расширением для rbenv)
Caleb
6
Если вы хотите запустить только один тест, вы добавляете номер файла начала теста в файл. Пример: rspec path / to / spec / file.rb: 455
runamok
201

Необработанный вызов:

грабли spec SPEC = spec / controllers / session_controller_spec.rb \
          SPEC_OPTS = "- e \" должен войти в систему с cookie \ ""

Теперь выясните, как встроить это в ваш редактор.

mislav
источник
1
Как я уже сказал, я не в рельсах, поэтому нет контроллеров. Но да, "rake spec SPEC = file.rb" работает. Спасибо! Сейчас я работаю над интеграцией Emacs.
Джонатан Тран
5
Не запускайте грабли, если можете их избежать. Требуются чертовы времена
Орион Эдвардс
2
Я изменил принятый ответ, но параметр SPEC_OPTS также помог мне.
Джонатан Тран
2
Вот что я называю хорошим ответом. Почему он не помечен как «Ответ»?
gmile
1
Запуск спецификаций часто является лучшим выбором, но во многих случаях вам приходится запускать рейк для различных магических битов в пользовательском файле Rakefile
Nerdmaster
124

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

rspec path/to/spec:<line number>

где -line номер- это номер строки, которая содержит часть вашего теста. Например, если у вас была такая спецификация:

1: 
2: it "should be awesome" do
3:   foo = 3
4:   foo.should eq(3)
5: end
6:

Допустим, он сохранен в spec / models / foo_spec.rb. Тогда вы бы запустить:

rspec spec/models/foo_spec.rb:2

и это будет просто запустить эту одну спецификацию. На самом деле это число может быть от 2 до 5.

Надеюсь это поможет!

juanpaco
источник
Это интересно, хотя похоже, что оно не работает, если вы реорганизуете свою спецификацию в несколько файлов (то есть вы можете использовать ее только с основным файлом _spec.rb, но если в нем нет ни одного из ваших примеров, он ничего не запустит Также, если вы попытаетесь использовать его для файла, который не является файлом спецификации верхнего уровня, он также ничего не запустит.)
Trejkaz
Я не совсем понимаю. Что вы имеете в виду под "файлом спецификации верхнего уровня?" Мой набор тестов почти всегда разделен на несколько файлов, и я всегда могу вызывать тесты в одном файле, используя этот метод. Вы имеете в виду наличие файла, который является requireвашими другими файлами спецификации?
Джуанпако
Я могу использовать это в любом файле на любом уровне в каталоге spec /. Я считаю, что Трейказ неверен.
Майкл Даррант
7
это круто и должно быть на высоте!
Томмазо Барбугли
4
Я использую это все время, но иногда вы хотите запустить несколько тестов из одного файла. Тогда вы можете напечатать все примеры, как это:rspec spec/models/foo_spec.rb:2:12:49
swilgosz
61

Вы также можете использовать фактический текст теста * e * xample с -e!

Таким образом, для:

it "shows the plane arrival time"

ты можешь использовать

rspec path/to/spec/file.rb -e 'shows the plane arrival time'
./scripts/spec path/to/spec/file.rb -e 'shows the plane arrival time'

Здесь нет необходимости в граблях.

tcurdt
источник
Это все, что вам нужно, за исключением того, что «spec» следует заменить на «rspec», как указано @bandhunt
Николас Вормсер
19

из справки (спец-ч):

-l, --line LINE_NUMBER           Execute example group or example at given line.
                                 (does not work for dynamically generated examples)

Пример: spec spec / runner_spec.rb -l 162

boblin
источник
3
В новых версиях Rspec вы добавляете номер строки после двоеточия в :соответствии с документацией и популярным ответом.
dragon788
13

Если вы установили rspec как плагин, а не как гем, у вас не будет specисполняемого файла.

В любом случае, все, что вам нужно сделать, это запустить файл с помощью ruby. Код rspec достаточно умен, чтобы запустить тесты для вас.

например:

ruby myclass_spec.rb
Орион Эдвардс
источник
2
Можно ли запустить один тест в файле, как это?
Ян Воан
12

http://github.com/grosser/single_test позволяет вам делать такие вещи, как ..

rake spec:user          #run spec/model/user_spec.rb (searches for user*_spec.rb)
rake test:users_c       #run test/functional/users_controller_test.rb
rake spec:user:token    #run the first spec in user_spec.rb that matches /token/
rake test:user:token    #run all tests in user_test.rb that match /token/
rake test:last
rake spec:last
Зик
источник
Похоже, что камень не был сохранен, последний коммит был 5 лет назад!
thegreendroid
10

Ruby 1.9.2 и Rails 3 имеют простой способ запустить один файл спецификации:

  ruby -I spec spec / models / user_spec.rb

Объяснение:

  • ruby Команда, как правило, быстрее, чем rake команда
  • -I spec означает «включать каталог« spec »при поиске файлов»
  • spec/models/user_spec.rb это файл, который мы хотим запустить.
joelparkerhenderson
источник
Можете ли вы запустить один тест в этом файле с некоторыми дополнительными параметрами?
Ян Воан
10

Чтобы запустить все ваши файлы rspec:rspec

примечание: вы должны быть в корне вашего проекта

Чтобы запустить один файл rspec:rspec 'path_to/spec.rb'

примечание: замените path_to / spec.rb на ваш путь. Кавычки необязательны.

Чтобы запустить один тест rspec из одного файла:rspec 'path_to/spec.rb:7'

примечание:: 7 - номер строки, с которой начинается тест

nflauria
источник
5

У меня были проблемы с тем, чтобы заставить работать любой из этих примеров, возможно, потому что пост старый и команды изменились?

После некоторого осмотра я нашел это работает:

rspec spec / models / user_spec.rb

Это запустит только один файл и обеспечит полезный вывод в терминале.

Грег Хемфилл
источник
Это было упомянуто в комментарии в принятом ответе. Да, я думаю, что этот пост настолько старый, что имя команды изменилось.
Джонатан Тран
3

Кроме того, посмотрите на автотест.

Запуск автотеста в командном окне будет означать, что файл спецификации будет выполняться всякий раз, когда вы сохраняете его. Кроме того, он будет запускаться всякий раз, когда запускается указанный вами файл.

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

fatgeekuk
источник
3

Хотя на этот вопрос было написано много хорошихtags ответов, ни один из них не использует подход Rspec .

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

Например, я добавляю тег «dev» со значением «current»:

it "creates an user", dev: :current do
  user = create(:user)
  expect(user.persisted?).to be_truthy
end

тогда я бегу

bundle exec rspec . --tag dev:current

Различные теги / значения могут быть установлены в отдельных спецификациях или группах.

Виктор Б.В.
источник
2

Допустим, вы запускаете тест для создания задачи. Вы всегда можете запустить этот конкретный код спецификации todo, используя файл crete_spec.rb, как показано ниже.

      rspec/spec/features/controller/spec_file_name.rb

   Example:

   Creating  rspec spec/features/todos/create_spec.rb
   Editing   rspec spec/features/todos/edit_spec.rb
   Deleting  rspec spec/features/todos/destroy_spec.rb

Если вы хотите запустить все спецификации в одном коротком.

   rspec 

Если вы хотите запустить все спецификации в конкретном контроллере пользователя, это.

  rspec/spec/feaures/controller_name

  Example:   rspec/spec/features/todos

Надеюсь, это даст вам больше понимания!

Прабхакар Ундурти
источник