Skip to content
This repository was archived by the owner on Nov 30, 2024. It is now read-only.

Commit 2d12304

Browse files
authored
Merge pull request #1357 from zhisme/main
raise ArgumentError if object cannot be proxied
2 parents 0acbd99 + c934c3e commit 2d12304

File tree

3 files changed

+44
-0
lines changed

3 files changed

+44
-0
lines changed

lib/rspec/mocks/proxy.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ def ensure_implemented(*_args)
2121

2222
# @private
2323
def initialize(object, order_group, options={})
24+
ensure_can_be_proxied!(object)
25+
2426
@object = object
2527
@order_group = order_group
2628
@error_generator = ErrorGenerator.new(object)
@@ -31,6 +33,20 @@ def initialize(object, order_group, options={})
3133
@method_doubles = Hash.new { |h, k| h[k] = MethodDouble.new(@object, k, self) }
3234
end
3335

36+
# @private
37+
def ensure_can_be_proxied!(object)
38+
return unless object.is_a?(Symbol) || object.frozen?
39+
return if object.nil?
40+
41+
msg = "Cannot proxy frozen objects"
42+
if Symbol === object
43+
msg << ". Symbols such as #{object} cannot be mocked or stubbed."
44+
else
45+
msg << ", rspec-mocks relies on proxies for method stubbing and expectations."
46+
end
47+
raise ArgumentError, msg
48+
end
49+
3450
# @private
3551
attr_reader :object
3652

spec/rspec/mocks/space_spec.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,22 @@ def create_generations
232232
}.to raise_error(RSpec::Expectations::ExpectationNotMetError, /Diff/)
233233
end
234234

235+
it 'raises ArgumentError with message if object is symbol' do
236+
space1 = Space.new
237+
object = :subject
238+
expected_message = "Cannot proxy frozen objects. Symbols such as #{object} cannot be mocked or stubbed."
239+
240+
expect { space1.proxy_for(object) }.to raise_error(ArgumentError, expected_message)
241+
end
242+
243+
it 'raises ArgumentError with message if object is frozen' do
244+
space1 = Space.new
245+
object = "subject".freeze
246+
expected_message = "Cannot proxy frozen objects, rspec-mocks relies on proxies for method stubbing and expectations."
247+
248+
expect { space1.proxy_for(object) }.to raise_error(ArgumentError, expected_message)
249+
end
250+
235251
def in_new_space_scope
236252
RSpec::Mocks.setup
237253
yield

spec/rspec/mocks/syntax_agnostic_message_matchers_spec.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@ module Mocks
4242

4343
reset subject
4444
end
45+
46+
context 'when target cannot be proxied' do
47+
it 'raises ArgumentError with message' do
48+
expect { ::RSpec::Mocks.allow_message(:subject, :foo) { :a } }.to raise_error(ArgumentError)
49+
end
50+
end
4551
end
4652

4753
RSpec.describe ".expect_message" do
@@ -91,6 +97,12 @@ module Mocks
9197

9298
verify subject
9399
end
100+
101+
context 'when target cannot be proxied' do
102+
it 'raises ArgumentError with message' do
103+
expect { ::RSpec::Mocks.expect_message(:subject, :foo) { :a } }.to raise_error(ArgumentError)
104+
end
105+
end
94106
end
95107
end
96108
end

0 commit comments

Comments
 (0)