Запуск налагодження ruby ​​у rspec?


77

Я намагаюся запустити налагоджувач Ruby в одній зі своїх специфікацій:

describe User do
  it "should be valid" do
    debugger
    User.new.should be_valid
  end
end

Однак, коли я запускаю rspec, я отримую:

debugger statement ignored, use -d or --debug option to enable debugging

Я спробував наступне:

rake spec --debug
rake spec --debug  --trace
rake spec:models --debug
bundle exec rspec --debug
bundle exec rspec --debug spec/models/
bundle exec rspec --d spec/models/
bundle exec "rspec --debug" spec/models/
bundle exec rspec --debugger spec/models/
bundle exec --debugger rspec spec/models/
bundle --debugger exec rspec spec/models/
bundle --debugger exec rspec spec/models/
bundle exec --debugger rspec spec/models/
bundle exec rspec --debugger spec/models/

Будь-які ідеї щодо того, як правильно виконати rspec? Я на Rails 3.0.5, Ruby 1.9.2, RSpec 2.5.1, ruby-debug19.

Дякую, Джастіне.


1
У підсумку я використав Прай, набагато простіше / краще. Після вставки в Gemfile та встановлення, киньте "binding.pry" у будь-яку точку вашої специфікації, виконайте, і ви будете кататися. Детальніше див. На екрані.
Allyl Isocyanate

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

Відповіді:


72

Ви отримаєте бажане, включивши require 'ruby-debug'у верхню частину специфікації:

# spec/models/user_spec.rb
require 'spec_helper'
require 'ruby-debug'

describe User do
  it "should be valid" do
    debugger
    User.new.should be_valid
  end
end

Потім ви б бігли rake specабо rspecяк зазвичай

ПРИМІТКА: Зараз я віддаю перевагу Ruby 2.0+ і піднімаю. Це майже той самий процес:

require 'spec_helper'
require 'pry-debugger'

describe User do
  it "should be valid" do
    binding.pry
    expect(User.new).to be_valid
  end
end

Крім того, я зазвичай ставлю такі вимоги у своєму файлі spec_helper, щоб pry-налагоджувач був доступний для всіх моїх специфікацій.


Примітка тут: моє рішення працює для додавання налагодження ruby ​​до одного конкретного специфікаційного файлу, рішення за допомогою Zetetic дозволяє налагоджувати весь проект.
Christopher Maujean

2
Рішення для мене не працює. Я отримую: не можу завантажити такий файл - ruby-налагодження (LoadError)
Фелікс Рабе

2
Re: вищезазначене. Потрібно для коментування рядка Gemfile за допомогою каменя ruby-debug19. (Вкладіть його в: test,: групи розробки насправді.) Працює зараз.
Фелікс Рабе,

Залежить від GEM, який ви використовуєте для налагодження. Я використовую "pry-rails"і "pry-byebug"так би і робив require 'pry-rails'. Також до Gemfile їх потрібно включитиtest environment
Фабріціо Бертольо,

27

Ви можете створити .rspecфайл конфігурації у кореневій частині проекту та включити рядок:

--debug

2
invalid option: --debug (defined in ./.rspec)
Ян Воган,

22

Для Ruby> = 1.9.2

Вам слід встановити дорогоцінний камінь налагоджувача замість ruby-debug19. Якщо ви використовуєте пакет , ви просто поміщаєте це у свій Gemfile:

group :test do
  gem "debugger"
end

Після цього можна просто ставити

rspec <3,0

--debug

rspec> = 3,0

-rdebugger

у вашому .rspecфайлі

Тоді можна просто бігти

bundle exec rake spec

без будь-яких додаткових аргументів. Не потрібно також модифікувати свій вихідний код (навіть не тестовий вихідний код)


3
+1 та спасибі, що вказали на це. Немає модифікації коду, щоб увімкнути налагоджувач, але вам доведеться змінити свій тестовий код, щоб викликати налагоджувач, точно так, як показано вгорі вихідного запитання (додати debuggerзаяву). Крім того, якщо ви запустите тест із spork, на консолі spork з'явиться підказка rdb, яка не відображає те, що ви вводите. Здається, найпростішим для запуску без spork.
Mark Berry

4
і якщо ви використовуєте byebug, то стає -rbyebug
MCR

16

Для ruby ​​2.0 я використовую byebug: https://github.com/deivid-rodriguez/byebug

gem 'byebug'

Код:

# spec/models/user_spec.rb
require 'spec_helper'
require 'byebug'

describe User do
  it "should be valid" do
    byebug
    User.new.should be_valid
  end
end

1
З якихось причин це рішення не працює. Проходить випробування
поїздка

@Trip це цікаво, може, замість того, щоб byebugспробувати додати debugger?
BotNet

9

Найкращий спосіб, який я знайшов для налагодження у rSpec, - це додавши наступне до вашого файлу "spec_helper.rb"

def logger
  Rails.logger
end

Потім ви можете отримати доступ до всіх методів реєстрації у ваших файлах rSpec та включити такі речі, як тегування журналу. Це, звичайно, для Rails 3 і вище. Якщо у вас є щось до Rails 3, додайте замість цього:

def logger
  RAILS_DEFAULT_LOGGER
end

Після того, як ви маєте свої протоколи ведення журналу на місці, ви можете ввести

tail -f log/test.log

у вашій оболонці терміналу, щоб переглядати ваші оператори ведення журналу під час запуску тестів.

Звичайно, у вашому фактичному тесті rspec ви б ввели щось на зразок

logger.debug "#{1.class}"  # => Fixnum

Якщо ви хочете відфільтрувати оператори налагодження з решти тестового журналу, просто додайте випадковий рядок до вашого оператора налагодження та передайте вихідні дані команди tail до grep.

Приклад:

logger.debug "random_string #{1.class}"   # => Fixnum

tail -f log/test.log | grep random_string

Оновлення

Я змінив свою думку щодо цього. Вам слід встановити pry, pry-doc та pry-debug, pry-debugger та pry-rails. Потім використовуйте binding.pry у своєму коді, щоб відкрити інтерактивну консоль налагоджувача, яка керує світом!


1
Величезний +1, це справді чудова підказка
hoitomt

Це не відповіло на запитання.
phatmann

phatmann, це найбільш правильний спосіб у Rails 3, що дозволяє входити в тести RSPEC. Після того, як ви додали метод у свій файл spec_helper.rb, ви можете реєструвати оператори налагодження за допомогою, logger.debug "#{1.class}" якщо ви хочете, ви можете додати випадковий рядок до вашого оператора налагодження та направити вихідні дані команди tail до grep, щоб відфільтрувати оператори налагодження .
Ода

2
Проголосування проти. ОП запитував про точки зупинки налагоджувача, а не про реєстрацію (що і так не є найкращою ідеєю в специфікаціях).
Marnen Laibow-Koser

1
Проголосування проти, з тієї ж причини, що і @ MarnenLaibow-Koser. Може бути корисною інформацією, але не відповідає на фактичне запитання OP.
denishaskin

4

Найкращий і найчистіший варіант - використовувати --requireу вашому .rspecфайлі. Те, що ви покладете, залежить від того, який дорогоцінний камінь ви використовуєте для налагодження.

--color
--require pry
--require rails_helper

Вони відповідають параметрам командного рядка (-d або --debug тепер застаріло).

Не соромтеся користуватися debugger, ruby-debugабо pry(підніміть рейки у вашому Gemfile).

Для вашого Gemfile:

group :test, :development do
  gem 'pry-rails'
end

Розміщення require 'ruby-debug'і т. Д. У верхній частині специфікації просто більш щільно пов’язане - тим більше, що тут коментар, що проголосував за вершиною, пропонує розміщувати його окремо у ВСІХ ваших файлах. З новим .rspecфайлом вам більше не потрібно буде розміщувати файли require 'spec_helper'або require 'rails_helper'вгорі.

Вони мають більше сенсу як неявні аргументи командного рядка.

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