уровень стека rspec слишком глубокий - PullRequest
2 голосов
/ 12 февраля 2012

Когда я запускаю спецификации модели и контроллера отдельно, это нормально.Когда я запускаю их вместе, я получаю переполнение стека, буквально:)

$ 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

Как мне вообще начать отлаживать это?Спасибо.

Ответы [ 4 ]

10 голосов
/ 13 февраля 2012

Удаление половины моих спецификаций за один раз обнажило проблему. Я полагаю, что это пример отладки пополам. Спасибо Фредерику Ченгу, чей комментарий предложил такой подход.

Для потомков это была проблема.

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. :)

1 голос
/ 12 февраля 2012

Вы можете либо поместить оператор debugger в свой код и отладить таким образом, либо просто начать использовать puts "got here" в тех местах кода, которые, как вы знаете, выполняются.Я бы предложил использовать что-то значимое вместо «попал сюда»: -)

0 голосов
/ 30 июля 2013

Возможно, вы можете получить ошибку «Невозможно найти совпадающую строку из обратного следа» в случае, если вы проверяете некоторую переменную, которая на самом деле не была инициализирована

В этом примере обратите внимание на переменную наблюдение который не инициализирован в неправильный фрагмент

неправильный фрагмент

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)}
0 голосов
/ 12 февраля 2012

Я бы начал с операторов puts или raise в ключевых точках вашего кода, чтобы вы могли сузить круг, какая строка вызывает проблему. Как только вы начинаете приближаться, вы можете закомментировать одну строку за раз, чтобы выяснить, с какой строкой исчезает проблема - как только вы укажете ее на одну строку, вы можете выяснить, что эта строка делает с Ruby. не нравится.

В общих чертах, с чего начать, «Уровень стека слишком глубокий», как правило, представляет собой бесконечный цикл или бесконечную рекурсивную проблему - я думаю, что происходит что-то, когда модель вызывает контроллер, который вызывает модель, или наоборот. -versa. Нет никакого способа узнать наверняка, пока вы не начнете комментировать строки, но любое место, где вы получили вызовы функций, будет входить в ваш подозрительный короткий список. Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...