簡體   English   中英

rspec堆棧級別太深

[英]rspec stack level too deep

當我單獨運行我的模型規格和控制器規格時,它很好。 當我一起運行它們時,我得到一個堆棧溢出,字面意思:)

$ 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

我怎么開始調試這個? 謝謝。

一次刪除一半我的規格出現了問題。 我想這是bisect調試的一個例子。 感謝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的知識。 :)

您可以在代碼中放置一個debugger語句並以這種方式進行調試,或者只是在您知道正在運行的代碼的位置開始使用puts "got here" 我建議使用有意義的東西,而不是“到這里”:-)

可能你可以得到“無法找到來自backtrace的匹配行”錯誤,以防你檢查一些實際上沒有初始化的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作為初始化程序,但忘記添加它,例如

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

我會在代碼的關鍵點開始使用putsraise語句,這樣你就可以開始縮小導致問題的那一行。 一旦你開始接近,你可以一次注釋掉一行來找出問題消失的那一行 - 一旦你把它歸結為一行,你就可以弄清楚那行是做什么的Ruby沒有不喜歡。

一般來說,從哪里開始,“堆棧級別太深”通常是無限循環或無限遞歸問題 - 我想象有一些模型正在調用調用模型的控制器,反之亦然。 在你開始評論線路之前無法確切知道,但任何有功能調用的地方都屬於你的可疑短名單。 祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM