2013-04-30 7 views
16

Часто, когда тест завершается неудачно, я потратил довольно много времени на то, чтобы выяснить, что привело к его провалу. Было бы полезно, если RSpec мог запустить отладчик Ruby, когда тест завершился неудачно, так что я могу сразу проверить локальные переменные, чтобы развернуть причину.Запустите отладчик ruby, если проверка rspec не удалась

Работа вокруг я использую сейчас выглядит примерно так:

# withing some test 
debugger unless some_variable.nil? 
expect(some_variable).to be_nil 

Однако такой подход является громоздким, потому что я сначала ждать тест на провал, а затем добавить отладчик строку, исправить проблема, а затем удалить строку отладчика, в то время как я хочу, чтобы она работала больше, чем gdb, которая имеет возможность ударить, когда удалено исключение, без необходимости перекопать базу кода с помощью debugger операторов.

Редактировать: Я пробовал Плимут. Для меня это не работало достаточно надежно. Кроме того, история развития, по-видимому, указывает на то, что она не очень хорошо поддерживается, поэтому я бы предпочел не полагаться на нее.

Обновление:: Я пробовал pry-rescue и нашел, что оно опрятно. Тем не менее, я часто использую zeus и задавался вопросом, есть ли способ заставить его работать с pry-rescue.

ответ

20

Использование pry-rescue, это духовный преемник Плимуте:

Из Readme:

Если вы используете RSpec или переспециализируются, вы можете открыть монтировку сессию на каждом непрохождения теста с помощью спасательной RSpec или спасение соответственно:

$ rescue rspec 
From: /home/conrad/0/ruby/pry-rescue/examples/example_spec.rb @ line 9 : 

    6: 
    7: describe "Float" do 
    8: it "should be able to add" do 
=> 9:  (0.1 + 0.2).should == 0.3 
    10: end 
    11: end 

RSpec::Expectations::ExpectationNotMetError: expected: 0.3 
    got: 0.30000000000000004 (using ==) 
[1] pry(main)> 
+0

спасибо - Я сделаю это. – Vighnesh

+3

Есть ли способ сделать эту работу с 'zeus'? – Vighnesh

+1

Просто попробовал его с новейшей версией zeus и pry-rescue, не работает – 23tux

0

Вы можете использовать plymouth gem https://github.com/banister/plymouth для этого. Используется pry, хотя, (лучше) альтернатива irb.

НТН

+0

Я пробовал Плимут. Для меня это не работало достаточно надежно. Кроме того, история развития, по-видимому, указывает на то, что она не очень хорошо поддерживается, поэтому я бы предпочел не полагаться на нее. – Vighnesh

1

Вы должны поймать ExpectationNotMatched исключение, пока он строится. Включите следующий код в своих помощниках где-нибудь, и RSpec остановится, когда будет построено исключение. Это будет несколько уровней в глубине внутри, поэтому в отладчике скажите «где», затем «вверх 5» или «вверх 6», и вы попадете в экземпляр экземпляра вашего блока. Отладчик не показывает код правильно в используемой вами версии, но вы можете «подняться» еще раз и перейти к запуску кода в том же контексте, где оценивается ваш тест, поэтому вы можете проверить переменные экземпляра (но а не локальные переменные, похоже).

require 'debugger' 
require 'rspec' 

Debugger.start 
class RSpec::Expectations::ExpectationNotMetError 
    alias_method :firstaid_initialize, :initialize 

    def initialize *args, &b 
    send(:firstaid_initialize, *args, &b) 
    puts "Stopped due to #{self.class}: #{message} at "+caller*"\n\t" 
    debugger 
    true # Exception thrown 
    end 
end 

describe "RSpec" do 
    it "should load use exceptions on should failure" do 
    @foo = :bar # An instance variable I can examine 
    1.should == 2 
    end 
end 
+0

Это выглядит очень многообещающе. Я попробую. Спасибо, Клиффорд! – Vighnesh

-1

Вы можете попробовать hammertime. Он остановится и предложит пригласить вас в интерактивную сессию отладки всякий раз, когда возникает исключение.

+1

[pry-rescue] (https://github.com/conradirwin/pry-rescue) (плагин pry) намного превосходит hammertime, он бросает вас в реальный контекст исключения и позволяет ходить по стеку – horseyguy

+0

I действительно должен переключиться на один из этих дней ... – davogones

+0

Я проверю это. Спасибо за совет. – Vighnesh

5

Вы не получите доступ к локальным переменным (легко) без debugger быть в рамках блока, однако RSpec предоставляет вокруг крюков, которые давайте вам сделать это:

config.around(:each) do |example| 
    result = example.run 
    debugger if result.is_a?(Exception) 
    puts "Debugging enabled" 
end 

тогда Вы имеете доступ к @ivars и subject/let(:var) содержание в этом пункте.

+0

Интересно. Это не поймало бы неудачи теста, не так ли? – Vighnesh

2

Мне нравится @ решение Йона-Роу (без дополнительных драгоценных камней необходимы) с небольшим редактированием: Я действительно не забочусь о других ошибках столько, сколько RSpec::Expectations::ExpectationNotMetError.

config.around(:each) do |example| 
    example.run.tap do |result| 
     debugger if result.is_a?(RSpec::Expectations::ExpectationNotMetError) 
    end 
    end 

 Смежные вопросы

  • Нет связанных вопросов^_^