From f9a2dc116bb284fbdaaefbe7d446bf619beb9e50 Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Fri, 27 Dec 2019 21:53:13 +0000 Subject: [PATCH 1/8] add is_a?(Class) check to AnyInstanceReceiver ... since this will always be true for classes, and reduces variance between ObjectReceiver and AnyInstanceReceiver. This will allow us to reduce duplication --- lib/mocha/receivers.rb | 2 +- test/unit/receivers_test.rb | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/mocha/receivers.rb b/lib/mocha/receivers.rb index f98e2781d..17522e4ff 100644 --- a/lib/mocha/receivers.rb +++ b/lib/mocha/receivers.rb @@ -27,7 +27,7 @@ def mocks while klass mocha = klass.any_instance.mocha(false) mocks << mocha if mocha - klass = klass.superclass + klass = klass.is_a?(Class) ? klass.superclass : nil end mocks end diff --git a/test/unit/receivers_test.rb b/test/unit/receivers_test.rb index 6b03e5c11..4386d2ab6 100644 --- a/test/unit/receivers_test.rb +++ b/test/unit/receivers_test.rb @@ -74,6 +74,10 @@ def initialize(superclass, mocha) def any_instance AnyInstance.new(@mocha) end + + def is_a?(_klass) + true + end end def test_mocks_returns_mocks_for_class_and_its_superclasses From 1fb156b503758f8160b798c249eccfd853553299 Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Fri, 27 Dec 2019 21:59:43 +0000 Subject: [PATCH 2/8] extract mock_owner to eliminate variance in mocks This will allow us to extract superclass or module since mock_owner is the only difference between ObjectReceiver and AnyInstanceReceiver --- lib/mocha/receivers.rb | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/mocha/receivers.rb b/lib/mocha/receivers.rb index 17522e4ff..8f3e602f8 100644 --- a/lib/mocha/receivers.rb +++ b/lib/mocha/receivers.rb @@ -8,12 +8,16 @@ def mocks object = @object mocks = [] while object - mocha = object.mocha(false) + mocha = mock_owner(object).mocha(false) mocks << mocha if mocha object = object.is_a?(Class) ? object.superclass : nil end mocks end + + def mock_owner(object) + object + end end class AnyInstanceReceiver @@ -25,12 +29,16 @@ def mocks klass = @klass mocks = [] while klass - mocha = klass.any_instance.mocha(false) + mocha = mock_owner(klass).mocha(false) mocks << mocha if mocha klass = klass.is_a?(Class) ? klass.superclass : nil end mocks end + + def mock_owner(klass) + klass.any_instance + end end class DefaultReceiver From c9fba41189062354878762b8b76822565d7fb630 Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Fri, 27 Dec 2019 22:12:04 +0000 Subject: [PATCH 3/8] extract superclass StubbedReceiver --- lib/mocha/receivers.rb | 21 ++++----------------- 1 file changed, 4 insertions(+), 17 deletions(-) diff --git a/lib/mocha/receivers.rb b/lib/mocha/receivers.rb index 8f3e602f8..7dba4fce2 100644 --- a/lib/mocha/receivers.rb +++ b/lib/mocha/receivers.rb @@ -1,5 +1,5 @@ module Mocha - class ObjectReceiver + class StubbedReceiver def initialize(object) @object = object end @@ -14,28 +14,15 @@ def mocks end mocks end + end + class ObjectReceiver < StubbedReceiver def mock_owner(object) object end end - class AnyInstanceReceiver - def initialize(klass) - @klass = klass - end - - def mocks - klass = @klass - mocks = [] - while klass - mocha = mock_owner(klass).mocha(false) - mocks << mocha if mocha - klass = klass.is_a?(Class) ? klass.superclass : nil - end - mocks - end - + class AnyInstanceReceiver < StubbedReceiver def mock_owner(klass) klass.any_instance end From 485438a8e4b96ef85fc1bf4fda332388d212d1a7 Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Fri, 27 Dec 2019 22:16:11 +0000 Subject: [PATCH 4/8] rename ObjectReceiver to InstanceReceiver This makes the parallel between {Stubbed,Instance,AnyInstance}{Method,Receiver} more apparent --- lib/mocha/mockery.rb | 2 +- lib/mocha/receivers.rb | 2 +- test/unit/receivers_test.rb | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/mocha/mockery.rb b/lib/mocha/mockery.rb index c9c53c329..5bb1eea06 100644 --- a/lib/mocha/mockery.rb +++ b/lib/mocha/mockery.rb @@ -71,7 +71,7 @@ def unnamed_mock end def mock_impersonating(object) - add_mock(Mock.new(self, ImpersonatingName.new(object), ObjectReceiver.new(object))) + add_mock(Mock.new(self, ImpersonatingName.new(object), InstanceReceiver.new(object))) end def mock_impersonating_any_instance_of(klass) diff --git a/lib/mocha/receivers.rb b/lib/mocha/receivers.rb index 7dba4fce2..761b55b9f 100644 --- a/lib/mocha/receivers.rb +++ b/lib/mocha/receivers.rb @@ -16,7 +16,7 @@ def mocks end end - class ObjectReceiver < StubbedReceiver + class InstanceReceiver < StubbedReceiver def mock_owner(object) object end diff --git a/test/unit/receivers_test.rb b/test/unit/receivers_test.rb index 4386d2ab6..260683a19 100644 --- a/test/unit/receivers_test.rb +++ b/test/unit/receivers_test.rb @@ -1,7 +1,7 @@ require File.expand_path('../../test_helper', __FILE__) require 'mocha/receivers' -class ObjectReceiverTest < Mocha::TestCase +class InstanceReceiverTest < Mocha::TestCase include Mocha class FakeObject @@ -37,7 +37,7 @@ def is_a?(klass) def test_mocks_returns_mock_for_object object = FakeObject.new(:mocha) - receiver = ObjectReceiver.new(object) + receiver = InstanceReceiver.new(object) assert_equal [:mocha], receiver.mocks end @@ -45,7 +45,7 @@ def test_mocks_returns_mocks_for_class_and_its_superclasses grandparent = FakeClass.new(nil, :grandparent_mocha) parent = FakeClass.new(grandparent, :parent_mocha) klass = FakeClass.new(parent, :mocha) - receiver = ObjectReceiver.new(klass) + receiver = InstanceReceiver.new(klass) assert_equal [:mocha, :parent_mocha, :grandparent_mocha], receiver.mocks end end From 98e70031b2433e62ae93f578805caeb331d79fe0 Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Fri, 27 Dec 2019 23:14:44 +0000 Subject: [PATCH 5/8] merge Fake{,AnyInstance}Class into FakeClass --- test/unit/receivers_test.rb | 72 ++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 41 deletions(-) diff --git a/test/unit/receivers_test.rb b/test/unit/receivers_test.rb index 260683a19..1ab651073 100644 --- a/test/unit/receivers_test.rb +++ b/test/unit/receivers_test.rb @@ -1,11 +1,21 @@ require File.expand_path('../../test_helper', __FILE__) require 'mocha/receivers' +module ReceiversTest + class FakeClass + class AnyInstance + def initialize(mocha) + @mocha = mocha + end -class InstanceReceiverTest < Mocha::TestCase - include Mocha + def mocha(_instantiate) + @mocha + end + end - class FakeObject - def initialize(mocha) + attr_reader :superclass + + def initialize(superclass, mocha) + @superclass = superclass @mocha = mocha end @@ -13,16 +23,22 @@ def mocha(_instantiate) @mocha end + def any_instance + AnyInstance.new(@mocha) + end + def is_a?(_klass) - false + true end end +end - class FakeClass - attr_reader :superclass +class InstanceReceiverTest < Mocha::TestCase + include Mocha + include ReceiversTest - def initialize(superclass, mocha) - @superclass = superclass + class FakeObject + def initialize(mocha) @mocha = mocha end @@ -30,8 +46,8 @@ def mocha(_instantiate) @mocha end - def is_a?(klass) - klass == Class + def is_a?(_klass) + false end end @@ -52,38 +68,12 @@ def test_mocks_returns_mocks_for_class_and_its_superclasses class AnyInstanceReceiverTest < Mocha::TestCase include Mocha - - class FakeAnyInstanceClass - class AnyInstance - def initialize(mocha) - @mocha = mocha - end - - def mocha(_instantiate) - @mocha - end - end - - attr_reader :superclass - - def initialize(superclass, mocha) - @superclass = superclass - @mocha = mocha - end - - def any_instance - AnyInstance.new(@mocha) - end - - def is_a?(_klass) - true - end - end + include ReceiversTest def test_mocks_returns_mocks_for_class_and_its_superclasses - grandparent = FakeAnyInstanceClass.new(nil, :grandparent_mocha) - parent = FakeAnyInstanceClass.new(grandparent, :parent_mocha) - klass = FakeAnyInstanceClass.new(parent, :mocha) + grandparent = FakeClass.new(nil, :grandparent_mocha) + parent = FakeClass.new(grandparent, :parent_mocha) + klass = FakeClass.new(parent, :mocha) receiver = AnyInstanceReceiver.new(klass) assert_equal [:mocha, :parent_mocha, :grandparent_mocha], receiver.mocks end From ba9b62f42a94a3457bd82e99f291e557352b1b97 Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Fri, 27 Dec 2019 23:26:23 +0000 Subject: [PATCH 6/8] set up {Moch,Stubb}aExampleTest as acceptance tests --- test/acceptance/mocha_example_test.rb | 12 +++++++++++- test/acceptance/stubba_example_test.rb | 12 +++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/test/acceptance/mocha_example_test.rb b/test/acceptance/mocha_example_test.rb index cab8667a8..257b0e294 100644 --- a/test/acceptance/mocha_example_test.rb +++ b/test/acceptance/mocha_example_test.rb @@ -1,6 +1,16 @@ -require File.expand_path('../../test_helper', __FILE__) +require File.expand_path('../acceptance_test_helper', __FILE__) class MochaExampleTest < Mocha::TestCase + include AcceptanceTest + + def setup + setup_acceptance_test + end + + def teardown + teardown_acceptance_test + end + class Rover def initialize(left_track, right_track, steps_per_metre, steps_per_degree) @left_track = left_track diff --git a/test/acceptance/stubba_example_test.rb b/test/acceptance/stubba_example_test.rb index 23ad39957..b84ab62e4 100644 --- a/test/acceptance/stubba_example_test.rb +++ b/test/acceptance/stubba_example_test.rb @@ -1,4 +1,4 @@ -require File.expand_path('../../test_helper', __FILE__) +require File.expand_path('../acceptance_test_helper', __FILE__) class Widget def model @@ -23,6 +23,16 @@ def self.wotsit end class StubbaExampleTest < Mocha::TestCase + include AcceptanceTest + + def setup + setup_acceptance_test + end + + def teardown + teardown_acceptance_test + end + def test_should_stub_instance_method widget = Widget.new widget.expects(:model).returns('different_model') From a70c3ab6ee6c90870b6b0e3d20cbe81758d320e3 Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Sat, 28 Dec 2019 10:42:46 +0000 Subject: [PATCH 7/8] rename ImpersonatingName to ImpersonatingInstanceName ... to make parallels with {Instance,AnyInstance}{Method,Receiver} more apparent --- lib/mocha/mockery.rb | 2 +- lib/mocha/names.rb | 2 +- test/unit/object_methods_test.rb | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/mocha/mockery.rb b/lib/mocha/mockery.rb index 5bb1eea06..590e9f21c 100644 --- a/lib/mocha/mockery.rb +++ b/lib/mocha/mockery.rb @@ -71,7 +71,7 @@ def unnamed_mock end def mock_impersonating(object) - add_mock(Mock.new(self, ImpersonatingName.new(object), InstanceReceiver.new(object))) + add_mock(Mock.new(self, ImpersonatingInstanceName.new(object), InstanceReceiver.new(object))) end def mock_impersonating_any_instance_of(klass) diff --git a/lib/mocha/names.rb b/lib/mocha/names.rb index 2a6990f55..c78eadcdf 100644 --- a/lib/mocha/names.rb +++ b/lib/mocha/names.rb @@ -1,5 +1,5 @@ module Mocha - class ImpersonatingName + class ImpersonatingInstanceName def initialize(object) @object = object end diff --git a/test/unit/object_methods_test.rb b/test/unit/object_methods_test.rb index 13b603a07..0b1151b7a 100644 --- a/test/unit/object_methods_test.rb +++ b/test/unit/object_methods_test.rb @@ -19,7 +19,7 @@ def test_should_build_mocha_referring_to_self mocha = @object.mocha assert_not_nil mocha assert mocha.is_a?(Mocha::Mock) - expected_name = Mocha::ImpersonatingName.new(@object).mocha_inspect + expected_name = Mocha::ImpersonatingInstanceName.new(@object).mocha_inspect assert_equal expected_name, mocha.mocha_inspect end From dee3ed4f6413660eb60683692eb4e9852f797e14 Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Fri, 17 Jan 2020 09:49:01 +0000 Subject: [PATCH 8/8] Refactor: rename mock_owner to stubbee --- lib/mocha/receivers.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/mocha/receivers.rb b/lib/mocha/receivers.rb index 761b55b9f..9e822f57d 100644 --- a/lib/mocha/receivers.rb +++ b/lib/mocha/receivers.rb @@ -8,7 +8,7 @@ def mocks object = @object mocks = [] while object - mocha = mock_owner(object).mocha(false) + mocha = stubbee(object).mocha(false) mocks << mocha if mocha object = object.is_a?(Class) ? object.superclass : nil end @@ -17,13 +17,13 @@ def mocks end class InstanceReceiver < StubbedReceiver - def mock_owner(object) + def stubbee(object) object end end class AnyInstanceReceiver < StubbedReceiver - def mock_owner(klass) + def stubbee(klass) klass.any_instance end end