2012-02-12 138 views
2

當我分別運行我的模型規格和控制器規格時,它很好。當我將它們放在一起運行時,出現堆棧溢出,字面意思:)rspec堆棧級別太深

$ bundle exec rspec --fail-fast spec/models 
........ 

Finished in 0.44274 seconds 
8 examples, 0 failures 

$ bundle exec rspec --fail-fast spec/controllers 
.. 

Finished in 0.99339 seconds 
2 examples, 0 failures 

$ bundle exec rspec --fail-fast spec 
F 

Failures: 

    1) HerpController derp derp example 
    Failure/Error: Unable to find matching line from backtrace 
    SystemStackError: 
     stack level too deep 
    # /Users/jared/.rvm/gems/ruby-1.9.2-p290/gems/actionpack-3.2.1/lib/abstract_controller/layouts.rb:359 

Finished in 0.02241 seconds 
1 example, 1 failure 

我該如何開始調試?謝謝。

+3

我會隨機刪除一半的控制器/型號規格,看看問題是否仍然存在。如果有,請刪除更多控制器規格。如果沒有,那麼恢復您移除的規格並移除最初留下的規格。重複,直到你把它縮小到一個特定的規格集 – 2012-02-12 15:16:22

回答

10

一次性移除我的一半規格後出現問題。我想這是一個平分調試的例子。感謝Frederick Cheung,他的評論提出了這種方法。

對於後人來說,這是個問題。

include Rails.application.routes.url_helpers 
describe "Attendee#next_page" do 
end 

顯然,包括去describe

describe "Attendee#next_page" do 
    include Rails.application.routes.url_helpers 
end 

我有很多東西需要學習rspec的內部。 :)

+0

還是很有幫助的(2017),謝謝! – 2017-10-05 04:20:35

+0

對於那些希望追求平分調試方法的人,您可能會發現'rspec --bisect'有幫助:https://relishapp.com/rspec/rspec-core/docs/command-line/bisect – 2018-02-20 06:24:34

1

您可以將debugger語句放入您的代碼並以此方式進行調試,或者僅在代碼的正在運行的位置開始使用puts "got here"。我會建議使用一些有意義的事情,而不是「來到這裏」太:-)

+0

這個'puts'技術也是我使用的,我必須說它必須是最被低估的調試方式! – 2014-06-10 12:34:49

0

我開始要麼在你的代碼的關鍵點putsraise語句,這樣你就可以開始縮小哪一行導致了問題。一旦你開始接近,你可以一次註釋掉一行,找出問題消失的路線 - 只要你把它放到一行,你就可以知道那行代碼是Ruby做的事情不喜歡。

關於從哪裏開始的一般術語來說,「堆棧級別太深」通常是無限循環或無限遞歸問題 - 我想象一下,模型調用控制器調用模型時會發生什麼,或者反之亦然。沒有辦法知道肯定,直到你開始註釋行,但任何地方你有函數調用將屬於你的可疑短名單。祝你好運!

0

也許你可以得到「無法找到匹配回溯線」的情況下,錯誤要檢查一些VAR這實際上並沒有

初始化在這個例子中要注意VAR 觀察未初始化在錯誤的片段

錯誤的片段

describe "GET index" do 
    it "assigns all observations as @observations" do 
    get :index, {}, valid_session 
    assigns(:observations).should eq([observation]) 
    end 
end 

固定例如(第3行)

describe "GET index" do 
    it "assigns all observations as @observations" do 
    observation = Observation.create! valid_attributes 
    get :index, {}, valid_session 
    assigns(:observations).should eq([observation]) 
    end 
end 

有時我們依賴於使用作爲初始值設定,但忘了添加它例如

let(:observation) {FactoryGirl.create(:observation)}