From 68e5f18a0e7e6b42390f015c62372a514c24c469 Mon Sep 17 00:00:00 2001 From: James Dabbs Date: Thu, 2 May 2019 20:59:49 -0500 Subject: [PATCH] Add reproduction spec for stack overflow in error formatting as initially reported in https://github.com/rspec/rspec-rails/issues/2049 The issue occurs when a class defines an `inspect` method which depends on methods that have been stubbed to e.g. `receive(...).at_most(n).times`. Failures try to call `inspect` which fails which calls `inspect` which ... --- spec/rspec/mocks/partial_double_spec.rb | 28 +++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/spec/rspec/mocks/partial_double_spec.rb b/spec/rspec/mocks/partial_double_spec.rb index c9c0e4a5f..b861c0172 100644 --- a/spec/rspec/mocks/partial_double_spec.rb +++ b/spec/rspec/mocks/partial_double_spec.rb @@ -152,6 +152,34 @@ def self.inspect }.to fail_with(/MyClass/) end + it "formats an error message when inspect fails" do + klass = Struct.new(:name) do + def inspect + "" + end + end + + object = klass.new('foo') + + expect(object).to receive(:name).once.and_return('bar') + + object.name + + expect do + object.name + end.to raise_error( + RSpec::Mocks::MockExpectationError, + %|().name(no args)\n expected: 1 time with any arguments\n received: 2 times| + ) + + expect do + verify object + end.to raise_error( + RSpec::Mocks::MockExpectationError, + %|().name(*(any args))\n expected: 1 time with any arguments\n received: 2 times with any arguments| + ) + end + it "shares message expectations with clone" do expect(object).to receive(:foobar) twin = object.clone