RSpec не дает мне никакого следа - PullRequest
0 голосов
/ 06 декабря 2011

Я пытаюсь получить обратную трассировку с помощью rspec, но не могу заставить ее работать по какой-то причине.

Это тестовый файл:

require 'spec_helper'

describe ActivityReport do
  it "should create a new instance given valid attributes" do
  activity = Factory(:activity_report)
end

Это команда, которую я запускаю:

rspec --backtrace spec/models/activity_report_spec.rb

И вот что я получаю:

No examples matched {:focus=>true}. Running all.

ActivityReport
  should create a new instance given valid attributes (FAILED - 1)

Failures:

  1) ActivityReport should create a new instance given valid attributes
     Failure/Error: Unable to find matching line from backtrace
     SystemStackError:
       stack level too deep
     # /Users/pbartels/.rvm/gems/ruby-1.9.2-p290@brothelking/gems/activerecord-3.1.1/lib/active_record/connection_adapters/abstract/database_statements.rb:206

Finished in 40.76 seconds
1 example, 1 failure

Failed examples:

rspec ./spec/models/activity_report_spec.rb:16 # ActivityReport should create a new instance given valid attributes

Мой .rspec:

--format nested
--color
--drb
--backtrace

И моя часть RSpec в spec_helper.rb:

ENV["RAILS_ENV"] ||= 'test'

require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'factory_girl'
require 'database_cleaner'
require 'active_record/fixtures'

DatabaseCleaner.strategy = :truncation
DatabaseCleaner.start

Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

RSpec.configure do |config|
  config.mock_with :rspec

  config.use_transactional_fixtures = true

  config.treat_symbols_as_metadata_keys_with_true_values = true  
  config.filter_run :focus => true  
  config.run_all_when_everything_filtered = true

  config.backtrace_clean_patterns = [
    /\/lib\d*\/ruby\//,
    /bin\//,
    #/gems/,
    /spec\/spec_helper\.rb/,
    /lib\/rspec\/(core|expectations|matchers|mocks)/
  ]
end

Я пробовал с "backtrace_clean_patterns" и без него.

Кто-нибудь знает, что здесь не так?

1 Ответ

5 голосов
/ 06 декабря 2011

Обратного следа нет, потому что это не конкретная строка кода, которая дает сбой, а структура вашего кода. Интерпретатору ruby ​​буквально не хватает места для хранения дальнейших вызовов методов в стеке.

Stack level too deep обычно означает, что вы недавно добавили / изменили код, который вызывает сам себя и входит в бесконечно рекурсивную черную дыру. Посмотрите на код, который вы недавно добавили (включая тесты) для подсказки. Посмотрите, вызываете ли вы метод изнутри себя.

Например, этот код вызовет переполнение стека:

def recursive_method
  recursive_method
end

У вас, вероятно, есть вызов метода или поле, которое разделяет имя метода, и когда вы ссылаетесь на него, он входит в этот бесконечный цикл / рекурсивный вызов.

Если это не укажет вам правильное направление, возможно, вам придется постепенно возвращать недавние изменения кода, пока проблема не исчезнет. Когда вы вернетесь к состоянию в своем коде, где проблема исчезнет, ​​вы поймете, что проблема связана с , что изменится, хотя детали могут быть не сразу понятны.

Другой вариант, если вы действительно ни к чему не привели (или невозможно разумно отменить изменения), - это начать добавлять строки отладки в ваш код, где вы подозреваете, что проблема может быть. Каким-то образом вам нужно будет заставить ваше приложение записывать в файл журнала или что-то еще, чтобы вы могли выяснить, что оно делает, прямо перед тем, как оно умрет.

...