2013-04-30 35 views
16

Thông thường, khi một kiểm tra thất bại, tôi dành một chút thời gian để tìm ra nguyên nhân khiến nó thất bại. Sẽ rất hữu ích nếu RSpec có thể khởi chạy trình gỡ rối Ruby khi kiểm tra thất bại, để tôi có thể kiểm tra các biến cục bộ ngay lập tức để tìm hiểu nguyên nhân.Khởi động trình gỡ lỗi ruby ​​nếu kiểm tra rspec thất bại

công việc xung quanh Các Tôi đang sử dụng ngay bây giờ trông giống như sau:

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

Tuy nhiên, phương pháp này là cồng kềnh, vì đầu tiên tôi chờ đợi cho một thử nghiệm thất bại, sau đó thêm dòng debugger, sửa chữa vấn đề và sau đó phải loại bỏ các dòng gỡ lỗi, trong khi tôi muốn nó hoạt động giống như gdb có khả năng khởi động khi một ngoại lệ được nhấn, mà không cần phải tiêu hóa cơ sở mã của bạn với các câu lệnh debugger.

Chỉnh sửa: Tôi đã thử Plymouth. Nó đã không làm việc đủ cho tôi. Ngoài ra lịch sử phát triển dường như chỉ ra rằng nó không phải là một viên ngọc được hỗ trợ rất tốt, vì vậy tôi không muốn dựa vào nó.

Cập nhật: Tôi đã thử ra pry-rescue và thấy nó gọn gàng. Tuy nhiên, tôi sử dụng zeus rất nhiều và đã tự hỏi nếu có cách nào để làm cho nó hoạt động với pry-rescue.

Trả lời

20

Sử dụng pry-rescue, đó là sự kế thừa tinh thần để Plymouth:

Từ Readme:

Nếu bạn đang sử dụng RSpec hoặc respec, bạn có thể mở một phiên nâng lên trên tất cả các thử nghiệm thất bại sử dụng cứu hộ rspec hoặc cứu hộ respec:

$ 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

cảm ơn - Tôi sẽ chụp ảnh này. – Vighnesh

+3

Có cách nào để thực hiện tác phẩm này với 'zeus' không? – Vighnesh

+1

Chỉ cần dùng thử với phiên bản mới nhất và phiên bản cứu hộ, không hoạt động – 23tux

0

Bạn có thể sử dụng plymouth gem https://github.com/banister/plymouth cho điều đó. Tuy nhiên, sử dụng pry, thay thế (tốt hơn) thành irb.

HTH

+0

Tôi đã thử Plymouth. Nó đã không làm việc đủ cho tôi. Ngoài ra lịch sử phát triển dường như chỉ ra rằng nó không phải là một viên ngọc được hỗ trợ rất tốt, vì vậy tôi không muốn dựa vào nó. – Vighnesh

1

Bạn cần nắm bắt ngoại lệ ExpectationNotMatched khi đang được xây dựng. Bao gồm mã sau trong trình trợ giúp của bạn ở đâu đó và RSpec sẽ dừng khi ngoại lệ được xây dựng. Đây sẽ là một số cấp độ sâu bên trong các matchers, do đó, trong trình gỡ lỗi, nói "ở đâu" sau đó "lên 5" hoặc "lên 6" và bạn sẽ được bên trong instance_exec của khối của bạn. Trình gỡ lỗi không hiển thị mã chính xác trong phiên bản tôi đang sử dụng, nhưng bạn có thể "tăng thêm" một lần nữa và nhận mã chạy trong cùng một ngữ cảnh mà bài kiểm tra của bạn được đánh giá, vì vậy bạn có thể kiểm tra các biến mẫu (nhưng không phải biến địa phương, có vẻ như).

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

Điều này có vẻ rất hứa hẹn. Tôi se thử no. Cảm ơn, Clifford! – Vighnesh

-1

Bạn có thể thử hammertime. Nó sẽ dừng lại và nhắc bạn đưa vào một phiên gỡ rối tương tác bất cứ khi nào ngoại lệ được nâng lên.

+1

[pry-rescue] (https://github.com/conradirwin/pry-rescue) (một plugin nâng cao) vượt trội so với hammertime, nó giảm bạn trong bối cảnh thực tế của ngoại lệ và cho phép bạn đi bộ ngăn xếp – horseyguy

+0

tôi thực sự nên chuyển sang để nâng lên một trong những ngày này ... – davogones

+0

Tôi sẽ kiểm tra xem nó ra. Cảm ơn vì tiền hỗ trợ. – Vighnesh

5

Bạn sẽ không nhận được quyền truy cập vào các biến địa phương (dễ dàng) mà không debugger là trong phạm vi của khối, tuy nhiên RSpec cung cấp cho bạn với khoảng móc mà cho phép của bạn làm điều này:

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

Sau đó bạn có thể truy cập @ivarssubject/let(:var) nội dung tại thời điểm này.

+0

Thú vị. Điều này sẽ không bắt gặp thất bại kiểm tra, phải không? – Vighnesh

2

tôi thích @ giải pháp jon-Rowe (không đá quý bổ sung cần thiết) với một chỉnh sửa nhỏ: tôi thực sự không quan tâm về các lỗi khác càng nhiều càng RSpec::Expectations::ExpectationNotMetError.

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