如何修复RSpec SystemStackError

时间:2015-10-02 00:03:03

标签: ruby-on-rails ruby ruby-on-rails-4 rspec rspec3

给出类似于

的代码
module UserDecorator
  def profile
    "Hi, my name is #{name}"
  end
end

require 'rails_helper'

describe UserDecorator do
  let(:user) { build(:user) }
  let(:decorated_user) { user.decorate }

  describe '#profile' do
    it 'uses #name' do
      expect(decorated_user).to receive(:name).and_call_original
      decorated_revenue_report_view.profile
    end
  end
end

我收到以下错误:

  1) UserDecorator#profile uses name
     Failure/Error: Unable to find matching line from backtrace
     SystemStackError:
       stack level too deep
     # /Users/agrimm/.rbenv/versions/2.1.6/lib/ruby/gems/2.1.0/gems/rspec-mocks-3.3.2/lib/rspec/mocks/argument_list_matcher.rb:65
     # 
     #   Showing full backtrace because every line was filtered out.
     #   See docs for RSpec::Configuration#backtrace_exclusion_patterns and
     #   RSpec::Configuration#backtrace_inclusion_patterns for more information.

这似乎是一个heisen-bug - 如果我先运行其他一些规范,我就不会得到SystemStackError。

我该如何解决?

我使用的是RSpec 3.3.0和Rails 4.1.13。

1 个答案:

答案 0 :(得分:0)

问题似乎是期待decorated_user收到name,而不是user。将规格更改为

require 'rails_helper'

describe UserDecorator do
  let(:user) { build(:user) }
  let(:decorated_user) { user.decorate }

  describe '#profile' do
    it 'uses User#name' do
      expect(user).to receive(:name).and_call_original
      decorated_revenue_report_view.profile
    end
  end
end

似乎解决了这个问题。我怀疑它与decorated_user同时拥有name到装饰对象user,并让RSpec必须处理name,但是我不能肯定地说。

据报道,所有者为treating it as a bug