Module: RSpec::Mocks::PartialClassDoubleProxyMethods
- Included in:
- PartialClassDoubleProxy, VerifyingPartialClassDoubleProxy
- Defined in:
- lib/rubypitaya/app-template/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.12.2/lib/rspec/mocks/proxy.rb
Overview
When we mock or stub a method on a class, we have to treat it a bit different, because normally singleton method definitions only affect the object on which they are defined, but on classes they affect subclasses, too. As a result, we need some special handling to get the original method.
Instance Method Summary collapse
- #initialize(source_space, *args) ⇒ Object
-
#original_method_handle_for(message) ⇒ Object
Consider this situation:.
Instance Method Details
#initialize(source_space, *args) ⇒ Object
384 385 386 387 |
# File 'lib/rubypitaya/app-template/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.12.2/lib/rspec/mocks/proxy.rb', line 384 def initialize(source_space, *args) @source_space = source_space super(*args) end |
#original_method_handle_for(message) ⇒ Object
Consider this situation:
class A; end
class B < A; end
allow(A).to receive(:new)
expect(B).to receive(:new).and_call_original
When getting the original definition for ‘B.new`, we cannot rely purely on using `B.method(:new)` before our redefinition is defined on `B`, because `B.method(:new)` will return a method that will execute the stubbed version of the method on `A` since singleton methods on classes are in the lookup hierarchy.
To do it properly, we need to find the original definition of ‘new` from `A` from before `A` was stubbed, and we need to rebind it to `B` so that it will run with the proper `self`.
That’s what this method (together with ‘original_unbound_method_handle_from_ancestor_for`) does.
409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 |
# File 'lib/rubypitaya/app-template/vendor/bundle/ruby/3.1.0/gems/rspec-mocks-3.12.2/lib/rspec/mocks/proxy.rb', line 409 def original_method_handle_for() unbound_method = superclass_proxy && superclass_proxy.original_unbound_method_handle_from_ancestor_for(.to_sym) return super unless unbound_method unbound_method.bind(object) # :nocov: rescue TypeError if RUBY_VERSION == '1.8.7' # In MRI 1.8.7, a singleton method on a class cannot be rebound to its subclass if unbound_method && unbound_method.owner.ancestors.first != unbound_method.owner # This is a singleton method; we can't do anything with it # But we can work around this using a different implementation double = method_double_from_ancestor_for() return object.method(double.method_stasher.stashed_method_name) end end raise # :nocov: end |