Як запустити єдиний тест RSpec?


306

У мене є такий файл:

/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

Файл специфікації:

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

Ви можете запустити свої тести, як bundle exec rspec ./spec/controllers/groups_controller_spec.rb:6, він виконує лише цей специфічний тест. Більше інформації тут: kolosek.com/rails-rspec-setup
Неша

bundle exec rspec spec --helpдам вам відповідь:
Томас Деко

Відповіді:


15

Не впевнений, як довго це доступно для бджіл, але є конфігурація 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#filter_run_when_matching-instance_method


1
Для цього потрібна зміна інфраструктури. І пам'ятаючи, щоб змінити його назад. Я рекомендував би цього не робити і використовувати лише rspecкоманди, щоб запустити специфікацію відповідним параметром, щоб вказати, який
Michael Durrant

482

Зазвичай я роблю:

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

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

EDIT1:

Ви також можете використовувати теги. Дивіться тут .

EDIT 2:

Спробуйте:

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

Дякую спробував, що це не працює, коли я виконую спекуляцію /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_model_spec.rb ./spec/models/user_model_spec.rb
AnApprentice

Якщо я спробую використовувати лише RSPEC, я отримую цю помилку: "$ rspec spec / controllers / groups_controller_spec.rb: 19 /Library/Ruby/Gems/1.8/gems/bundler-1.0.0/lib/bundler/runtime.rb:27 : у `setup ': Ви вже активували rspec-core 2.6.2, але для вашого Gemfile потрібен rspec-core 2.6.0. Подумайте про використання пакету exec. (Gem :: LoadError)"
AnApprentice

Ви можете спробувати "bundle exec rspec spec / controllers / groups_controller_spec.rb: 19" у цьому випадку
muffinista

bundle exec працював, але чому? Хіба це хакер будь-яким способом уникнути цього?
Підручник

11
це не хак, він обов'язково використовує ту саму версію, яку ви заявили у своєму gemfile. У вашому випадку просто rspecне вдалося, оскільки версія у вашій системі є більш пізньою, ніж версія у вашому gemfile.
апнедівінг

67

З граблями:

rake spec SPEC=path/to/spec.rb

(Кредит підходить до цієї відповіді . Ідіть, проголосуйте за нього.)

EDIT (завдяки @cirosantilli): щоб запустити один конкретний сценарій у специфікації, вам слід надати відповідність шаблону регулярних виразів, що відповідає опису.

rake spec SPEC=path/to/spec.rb \
          SPEC_OPTS="-e \"should be successful and return 3 items\""

11
Це найкраща відповідь, оскільки він використовує команду 'rake spec', а не команду 'rspec'. Це означає, що тестова база даних правильно повторно ініціалізується щоразу (що не трапляється, якщо ви використовуєте 'rspec ...')
jpw

Ви можете використовувати SPEC=path/to/spec.rb:42для запуску тесту за вказаним номером рядка, хоча, здається, будь-які it_behaves_likeтести також запустяться (помилка?).
мгдол

61

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

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

Оновлення 2019 року: Rspec2 перейшов з команди 'spec' на команду 'rspec'.


Дякую, я спробував це, але це помилки з: $ rake spec spec / Controller / incoming_mails_controller_spec.rb -e "має бути успішним і повернути 3 пункти" рейк перерваний! (eval): 1: у `standard_rake_options ': помилка компіляції (eval): 1: синтаксична помилка, несподіваний TIDENTIFIER, очікуючи, що $ end має бути успішним та повернути 3 пункти
AnApprentice

Оновлено фактичні ідеї файлів специфікацій?
AnApprentice

Якщо у вас помилка компіляції, ваша специфікація не є дійсною рубіном. Переконайтеся , що ви не пропускаючи ні doпісля it, contextабо describeдекларації.
Дуглас Ф Ширер

1
Це "spec", а не "spec spec".
muffinista

це має бути правильна відповідь, що стосується номера рядка серйозно помиляється - будь-який випадок
Eugen Mayer

27

Є багато варіантів:

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

23

Мій кращий метод для виконання конкретних тестів трохи відрізняється - я додав рядки

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

На мій файл spec_helper.

Тепер, коли я хочу запустити один конкретний тест (або контекст, або специфікацію), я можу просто додати тег "фокус" до нього та запустити тест як звичайний - виконуватимуться лише цілеспрямовані тести. Якщо я видаляю всі теги фокусування, run_all_when_everything_filteredпочинається і виконуються всі тести як звичайні.

Це не так швидко і просто, як параметри командного рядка - він вимагає відредагувати файл для тесту, який ви хочете запустити. Але це дає вам набагато більше контролю, я відчуваю.


Я, безумовно, віддаю перевагу цьому стилю, оскільки я зазвичай запускаю тести через Rubymine / intelliJ. Мені цей метод подобається ще й тому, що його схоже на використання fit / xit в
жасмині

9

@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-ю групою вищого рівня, визначеною в специфікації / одиниці / 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

У рейках 5,

Я використовував цей спосіб для запуску одного тестового файлу (усі тести в одному файлі)

rails test -n /TopicsControllerTest/ -v

Ім'я класу можна використовувати для відповідності бажаному файлу TopicsControllerTest

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

Вихід:

введіть тут опис зображення

Якщо ви хочете, ви можете налаштувати регулярний вираз, щоб він відповідав одному методу тестування \TopicsControllerTest#test_Should_delete\

rails test -n /TopicsControllerTest#test_Should_delete/ -v

4

Для моделі він буде працювати лише у рядку № 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 

3

Запустіть команди з кореневого каталогу вашого проекту:

# 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

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

З огляду на те, що ти перебуваєш у проекті рейки 3 з rspec 2, з кореневого каталогу рейки:

  bundle exec rspec spec/controllers/groups_controller_spec.rb 

обов'язково повинен працювати. я втомився вводити текст, тому я створив псевдонім, щоб скоротити 'bundle exec rspec' до 'bersp'

'bundle exec' - це те, що він завантажує точне середовище дорогоцінного каміння, вказане у вашому файлі дорогоцінних каменів: http://gembundler.com/

Rspec2 перейшов з команди "spec" на команду "rspec".


0

Я використовую цей дорогоцінний камінь для автоматичного запуску свого тесту. Він виконує тест після створення або оновлення операцій на тестовому файлі.

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

або зазвичай ви можете запустити за допомогою наступної команди

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



0

Можна використовувати

 rspec spec/controllers/groups_controller_spec.rb:<line_number>

номер рядка повинен бути номером рядка рядків "описувати" або "він", щоб він виконував тести, присутні в цьому конкретному блоці. замість цього він виконає всі рядки поруч із рядком_ номер.

також ви можете створити блок із власною назвою, а потім можете виконати лише ці блоки.


0

Ще одна поширена помилка - це все-таки мати або модернізувати старіший додаток 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 році (але, звичайно, ви змусите його працювати, з урахуванням інших міркувань)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.