From c20305825278f18014610a94a8b145807e1e877d Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Fri, 3 Jan 2020 15:11:30 +0000 Subject: [PATCH 01/33] move define/remove method to setup/teardown --- ...ce_method_defined_on_kernel_module_test.rb | 36 ++++--------------- 1 file changed, 6 insertions(+), 30 deletions(-) diff --git a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb index b51fea761..58e91196b 100644 --- a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb @@ -5,17 +5,20 @@ class StubInstanceMethodDefinedOnKernelModuleTest < Mocha::TestCase def setup setup_acceptance_test + Kernel.module_eval do + def my_instance_method + :original_return_value + end + end end def teardown + Kernel.module_eval { remove_method :my_instance_method } teardown_acceptance_test end def test_should_stub_public_method_and_leave_it_unchanged_after_test Kernel.module_eval do - def my_instance_method - :original_return_value - end public :my_instance_method end instance = Class.new.new @@ -27,15 +30,10 @@ def my_instance_method assert_passed(test_result) end assert_equal :original_return_value, instance.my_instance_method - ensure - Kernel.module_eval { remove_method :my_instance_method } end def test_should_stub_protected_method_and_leave_it_unchanged_after_test Kernel.module_eval do - def my_instance_method - :original_return_value - end protected :my_instance_method end instance = Class.new.new @@ -47,15 +45,10 @@ def my_instance_method assert_passed(test_result) end assert_equal :original_return_value, instance.send(:my_instance_method) - ensure - Kernel.module_eval { remove_method :my_instance_method } end def test_should_stub_private_method_and_leave_it_unchanged_after_test Kernel.module_eval do - def my_instance_method - :original_return_value - end private :my_instance_method end instance = Class.new.new @@ -67,15 +60,10 @@ def my_instance_method assert_passed(test_result) end assert_equal :original_return_value, instance.send(:my_instance_method) - ensure - Kernel.module_eval { remove_method :my_instance_method } end def test_should_stub_public_module_method_and_leave_it_unchanged_after_test Kernel.module_eval do - def my_instance_method - :original_return_value - end public :my_instance_method end mod = Module.new @@ -88,15 +76,10 @@ def my_instance_method assert_passed(test_result) end assert_equal :original_return_value, mod.my_instance_method - ensure - Kernel.module_eval { remove_method :my_instance_method } end def test_should_stub_protected_module_method_and_leave_it_unchanged_after_test Kernel.module_eval do - def my_instance_method - :original_return_value - end protected :my_instance_method end mod = Module.new @@ -109,15 +92,10 @@ def my_instance_method assert_passed(test_result) end assert_equal :original_return_value, mod.send(:my_instance_method) - ensure - Kernel.module_eval { remove_method :my_instance_method } end def test_should_stub_private_module_method_and_leave_it_unchanged_after_test Kernel.module_eval do - def my_instance_method - :original_return_value - end private :my_instance_method end mod = Module.new @@ -130,7 +108,5 @@ def my_instance_method assert_passed(test_result) end assert_equal :original_return_value, mod.send(:my_instance_method) - ensure - Kernel.module_eval { remove_method :my_instance_method } end end From 36888e8ddb6894a2904bea191176dcc6006f026f Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Fri, 3 Jan 2020 15:14:01 +0000 Subject: [PATCH 02/33] replace module_eval with send --- ...ce_method_defined_on_kernel_module_test.rb | 32 +++++-------------- 1 file changed, 8 insertions(+), 24 deletions(-) diff --git a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb index 58e91196b..25959a79c 100644 --- a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb @@ -5,22 +5,16 @@ class StubInstanceMethodDefinedOnKernelModuleTest < Mocha::TestCase def setup setup_acceptance_test - Kernel.module_eval do - def my_instance_method - :original_return_value - end - end + Kernel.send(:define_method, :my_instance_method) { :original_return_value } end def teardown - Kernel.module_eval { remove_method :my_instance_method } + Kernel.send(:remove_method, :my_instance_method) teardown_acceptance_test end def test_should_stub_public_method_and_leave_it_unchanged_after_test - Kernel.module_eval do - public :my_instance_method - end + Kernel.send(:public, :my_instance_method) instance = Class.new.new assert_snapshot_unchanged(instance) do test_result = run_as_test do @@ -33,9 +27,7 @@ def test_should_stub_public_method_and_leave_it_unchanged_after_test end def test_should_stub_protected_method_and_leave_it_unchanged_after_test - Kernel.module_eval do - protected :my_instance_method - end + Kernel.send(:protected, :my_instance_method) instance = Class.new.new assert_snapshot_unchanged(instance) do test_result = run_as_test do @@ -48,9 +40,7 @@ def test_should_stub_protected_method_and_leave_it_unchanged_after_test end def test_should_stub_private_method_and_leave_it_unchanged_after_test - Kernel.module_eval do - private :my_instance_method - end + Kernel.send(:private, :my_instance_method) instance = Class.new.new assert_snapshot_unchanged(instance) do test_result = run_as_test do @@ -63,9 +53,7 @@ def test_should_stub_private_method_and_leave_it_unchanged_after_test end def test_should_stub_public_module_method_and_leave_it_unchanged_after_test - Kernel.module_eval do - public :my_instance_method - end + Kernel.send(:public, :my_instance_method) mod = Module.new assert_snapshot_unchanged(mod) do test_result = run_as_test do @@ -79,9 +67,7 @@ def test_should_stub_public_module_method_and_leave_it_unchanged_after_test end def test_should_stub_protected_module_method_and_leave_it_unchanged_after_test - Kernel.module_eval do - protected :my_instance_method - end + Kernel.send(:protected, :my_instance_method) mod = Module.new assert_snapshot_unchanged(mod) do test_result = run_as_test do @@ -95,9 +81,7 @@ def test_should_stub_protected_module_method_and_leave_it_unchanged_after_test end def test_should_stub_private_module_method_and_leave_it_unchanged_after_test - Kernel.module_eval do - private :my_instance_method - end + Kernel.send(:private, :my_instance_method) mod = Module.new assert_snapshot_unchanged(mod) do test_result = run_as_test do From c455732f01bc15be356a5f97f3e5fd387be16dfe Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Fri, 3 Jan 2020 15:28:06 +0000 Subject: [PATCH 03/33] prep to DRY by using send instead of direct invocation ... making it identical to protected and private method cases --- .../stub_instance_method_defined_on_kernel_module_test.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb index 25959a79c..cee1caea9 100644 --- a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb @@ -19,11 +19,11 @@ def test_should_stub_public_method_and_leave_it_unchanged_after_test assert_snapshot_unchanged(instance) do test_result = run_as_test do instance.stubs(:my_instance_method).returns(:new_return_value) - assert_equal :new_return_value, instance.my_instance_method + assert_equal :new_return_value, instance.send(:my_instance_method) end assert_passed(test_result) end - assert_equal :original_return_value, instance.my_instance_method + assert_equal :original_return_value, instance.send(:my_instance_method) end def test_should_stub_protected_method_and_leave_it_unchanged_after_test From d2362c57fa4a0a239f8eec931b1b99b17a048e85 Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Fri, 3 Jan 2020 15:29:21 +0000 Subject: [PATCH 04/33] DRY up public, protected and private checks --- ...ce_method_defined_on_kernel_module_test.rb | 44 +++++++------------ 1 file changed, 17 insertions(+), 27 deletions(-) diff --git a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb index cee1caea9..b30f40c2a 100644 --- a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb @@ -15,41 +15,17 @@ def teardown def test_should_stub_public_method_and_leave_it_unchanged_after_test Kernel.send(:public, :my_instance_method) - instance = Class.new.new - assert_snapshot_unchanged(instance) do - test_result = run_as_test do - instance.stubs(:my_instance_method).returns(:new_return_value) - assert_equal :new_return_value, instance.send(:my_instance_method) - end - assert_passed(test_result) - end - assert_equal :original_return_value, instance.send(:my_instance_method) + assert_snapshot_unchanged_on_stubbing end def test_should_stub_protected_method_and_leave_it_unchanged_after_test Kernel.send(:protected, :my_instance_method) - instance = Class.new.new - assert_snapshot_unchanged(instance) do - test_result = run_as_test do - instance.stubs(:my_instance_method).returns(:new_return_value) - assert_equal :new_return_value, instance.send(:my_instance_method) - end - assert_passed(test_result) - end - assert_equal :original_return_value, instance.send(:my_instance_method) + assert_snapshot_unchanged_on_stubbing end def test_should_stub_private_method_and_leave_it_unchanged_after_test Kernel.send(:private, :my_instance_method) - instance = Class.new.new - assert_snapshot_unchanged(instance) do - test_result = run_as_test do - instance.stubs(:my_instance_method).returns(:new_return_value) - assert_equal :new_return_value, instance.send(:my_instance_method) - end - assert_passed(test_result) - end - assert_equal :original_return_value, instance.send(:my_instance_method) + assert_snapshot_unchanged_on_stubbing end def test_should_stub_public_module_method_and_leave_it_unchanged_after_test @@ -93,4 +69,18 @@ def test_should_stub_private_module_method_and_leave_it_unchanged_after_test end assert_equal :original_return_value, mod.send(:my_instance_method) end + + private + + def assert_snapshot_unchanged_on_stubbing + instance = Class.new.new + assert_snapshot_unchanged(instance) do + test_result = run_as_test do + instance.stubs(:my_instance_method).returns(:new_return_value) + assert_equal :new_return_value, instance.send(:my_instance_method) + end + assert_passed(test_result) + end + assert_equal :original_return_value, instance.send(:my_instance_method) + end end From 26de50edc8b483a47415787e3b6062c6b9e974f5 Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Fri, 3 Jan 2020 15:32:27 +0000 Subject: [PATCH 05/33] Prep to DRY - use send & extract visibility to a var --- ...stub_instance_method_defined_on_kernel_module_test.rb | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb index b30f40c2a..26cd071ce 100644 --- a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb @@ -29,17 +29,18 @@ def test_should_stub_private_method_and_leave_it_unchanged_after_test end def test_should_stub_public_module_method_and_leave_it_unchanged_after_test - Kernel.send(:public, :my_instance_method) + visibility = :public + Kernel.send(visibility, :my_instance_method) mod = Module.new assert_snapshot_unchanged(mod) do test_result = run_as_test do mod.stubs(:my_instance_method).returns(:new_return_value) - assert_method_visibility mod, :my_instance_method, :public - assert_equal :new_return_value, mod.my_instance_method + assert_method_visibility mod, :my_instance_method, visibility + assert_equal :new_return_value, mod.send(:my_instance_method) end assert_passed(test_result) end - assert_equal :original_return_value, mod.my_instance_method + assert_equal :original_return_value, mod.send(:my_instance_method) end def test_should_stub_protected_module_method_and_leave_it_unchanged_after_test From 6fe37026e348a5986ed1dc7c9fe7b45463a7fbb3 Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Fri, 3 Jan 2020 15:39:29 +0000 Subject: [PATCH 06/33] DRY up Module public, protected and private checks --- ...ce_method_defined_on_kernel_module_test.rb | 37 +++++-------------- 1 file changed, 10 insertions(+), 27 deletions(-) diff --git a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb index 26cd071ce..211101cad 100644 --- a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb @@ -29,41 +29,26 @@ def test_should_stub_private_method_and_leave_it_unchanged_after_test end def test_should_stub_public_module_method_and_leave_it_unchanged_after_test - visibility = :public - Kernel.send(visibility, :my_instance_method) - mod = Module.new - assert_snapshot_unchanged(mod) do - test_result = run_as_test do - mod.stubs(:my_instance_method).returns(:new_return_value) - assert_method_visibility mod, :my_instance_method, visibility - assert_equal :new_return_value, mod.send(:my_instance_method) - end - assert_passed(test_result) - end - assert_equal :original_return_value, mod.send(:my_instance_method) + assert_snapshot_unchanged_on_stubbing_module_method(:public) end def test_should_stub_protected_module_method_and_leave_it_unchanged_after_test - Kernel.send(:protected, :my_instance_method) - mod = Module.new - assert_snapshot_unchanged(mod) do - test_result = run_as_test do - mod.stubs(:my_instance_method).returns(:new_return_value) - assert_method_visibility mod, :my_instance_method, :protected - assert_equal :new_return_value, mod.send(:my_instance_method) - end - assert_passed(test_result) - end - assert_equal :original_return_value, mod.send(:my_instance_method) + assert_snapshot_unchanged_on_stubbing_module_method(:protected) end def test_should_stub_private_module_method_and_leave_it_unchanged_after_test - Kernel.send(:private, :my_instance_method) + assert_snapshot_unchanged_on_stubbing_module_method(:private) + end + + private + + def assert_snapshot_unchanged_on_stubbing_module_method(visibility) + Kernel.send(visibility, :my_instance_method) mod = Module.new assert_snapshot_unchanged(mod) do test_result = run_as_test do mod.stubs(:my_instance_method).returns(:new_return_value) - assert_method_visibility mod, :my_instance_method, :private + assert_method_visibility mod, :my_instance_method, visibility assert_equal :new_return_value, mod.send(:my_instance_method) end assert_passed(test_result) @@ -71,8 +56,6 @@ def test_should_stub_private_module_method_and_leave_it_unchanged_after_test assert_equal :original_return_value, mod.send(:my_instance_method) end - private - def assert_snapshot_unchanged_on_stubbing instance = Class.new.new assert_snapshot_unchanged(instance) do From fec664a5da3e72932c9d8b292d080db7756cd87a Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Fri, 3 Jan 2020 15:46:09 +0000 Subject: [PATCH 07/33] prep to DRY by making assert methods near identical --- ...stance_method_defined_on_kernel_module_test.rb | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb index 211101cad..6ad19a761 100644 --- a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb @@ -14,18 +14,15 @@ def teardown end def test_should_stub_public_method_and_leave_it_unchanged_after_test - Kernel.send(:public, :my_instance_method) - assert_snapshot_unchanged_on_stubbing + assert_snapshot_unchanged_on_stubbing(:public) end def test_should_stub_protected_method_and_leave_it_unchanged_after_test - Kernel.send(:protected, :my_instance_method) - assert_snapshot_unchanged_on_stubbing + assert_snapshot_unchanged_on_stubbing(:protected) end def test_should_stub_private_method_and_leave_it_unchanged_after_test - Kernel.send(:private, :my_instance_method) - assert_snapshot_unchanged_on_stubbing + assert_snapshot_unchanged_on_stubbing(:private) end def test_should_stub_public_module_method_and_leave_it_unchanged_after_test @@ -43,8 +40,8 @@ def test_should_stub_private_module_method_and_leave_it_unchanged_after_test private def assert_snapshot_unchanged_on_stubbing_module_method(visibility) - Kernel.send(visibility, :my_instance_method) mod = Module.new + Kernel.send(visibility, :my_instance_method) assert_snapshot_unchanged(mod) do test_result = run_as_test do mod.stubs(:my_instance_method).returns(:new_return_value) @@ -56,11 +53,13 @@ def assert_snapshot_unchanged_on_stubbing_module_method(visibility) assert_equal :original_return_value, mod.send(:my_instance_method) end - def assert_snapshot_unchanged_on_stubbing + def assert_snapshot_unchanged_on_stubbing(visibility) instance = Class.new.new + Kernel.send(visibility, :my_instance_method) assert_snapshot_unchanged(instance) do test_result = run_as_test do instance.stubs(:my_instance_method).returns(:new_return_value) + assert_method_visibility instance, :my_instance_method, visibility assert_equal :new_return_value, instance.send(:my_instance_method) end assert_passed(test_result) From 9c47db139df585b9890cccd5fd00ca7f172c34c3 Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Fri, 3 Jan 2020 15:47:47 +0000 Subject: [PATCH 08/33] DRY up assert_snapshot_unchanged_on_stubbing* --- ...ance_method_defined_on_kernel_module_test.rb | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb index 6ad19a761..944e98b2d 100644 --- a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb @@ -40,21 +40,14 @@ def test_should_stub_private_module_method_and_leave_it_unchanged_after_test private def assert_snapshot_unchanged_on_stubbing_module_method(visibility) - mod = Module.new - Kernel.send(visibility, :my_instance_method) - assert_snapshot_unchanged(mod) do - test_result = run_as_test do - mod.stubs(:my_instance_method).returns(:new_return_value) - assert_method_visibility mod, :my_instance_method, visibility - assert_equal :new_return_value, mod.send(:my_instance_method) - end - assert_passed(test_result) - end - assert_equal :original_return_value, mod.send(:my_instance_method) + assert_snapshot_unchanged_on_stubbing_method(visibility, Module.new) end def assert_snapshot_unchanged_on_stubbing(visibility) - instance = Class.new.new + assert_snapshot_unchanged_on_stubbing_method(visibility, Class.new.new) + end + + def assert_snapshot_unchanged_on_stubbing_method(visibility, instance) Kernel.send(visibility, :my_instance_method) assert_snapshot_unchanged(instance) do test_result = run_as_test do From 90570ec60745f5fec8bc4c9b23cf2cf80e15e7e2 Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Fri, 3 Jan 2020 16:20:39 +0000 Subject: [PATCH 09/33] inline delegating methods --- ...ce_method_defined_on_kernel_module_test.rb | 22 +++++-------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb index 944e98b2d..24355b1db 100644 --- a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb @@ -14,37 +14,27 @@ def teardown end def test_should_stub_public_method_and_leave_it_unchanged_after_test - assert_snapshot_unchanged_on_stubbing(:public) + assert_snapshot_unchanged_on_stubbing_method(:public, Class.new.new) end def test_should_stub_protected_method_and_leave_it_unchanged_after_test - assert_snapshot_unchanged_on_stubbing(:protected) + assert_snapshot_unchanged_on_stubbing_method(:protected, Class.new.new) end def test_should_stub_private_method_and_leave_it_unchanged_after_test - assert_snapshot_unchanged_on_stubbing(:private) + assert_snapshot_unchanged_on_stubbing_method(:private, Class.new.new) end def test_should_stub_public_module_method_and_leave_it_unchanged_after_test - assert_snapshot_unchanged_on_stubbing_module_method(:public) + assert_snapshot_unchanged_on_stubbing_method(:public, Module.new) end def test_should_stub_protected_module_method_and_leave_it_unchanged_after_test - assert_snapshot_unchanged_on_stubbing_module_method(:protected) + assert_snapshot_unchanged_on_stubbing_method(:protected, Module.new) end def test_should_stub_private_module_method_and_leave_it_unchanged_after_test - assert_snapshot_unchanged_on_stubbing_module_method(:private) - end - - private - - def assert_snapshot_unchanged_on_stubbing_module_method(visibility) - assert_snapshot_unchanged_on_stubbing_method(visibility, Module.new) - end - - def assert_snapshot_unchanged_on_stubbing(visibility) - assert_snapshot_unchanged_on_stubbing_method(visibility, Class.new.new) + assert_snapshot_unchanged_on_stubbing_method(:private, Module.new) end def assert_snapshot_unchanged_on_stubbing_method(visibility, instance) From 32562f17870a7c4c93c9c1e0c36b6ed943adf5e0 Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Fri, 3 Jan 2020 16:22:09 +0000 Subject: [PATCH 10/33] rename assert_snapshot_unchanged_on_stubbing_method --- ...nstance_method_defined_on_kernel_module_test.rb | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb index 24355b1db..64f2a70fc 100644 --- a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb @@ -14,30 +14,30 @@ def teardown end def test_should_stub_public_method_and_leave_it_unchanged_after_test - assert_snapshot_unchanged_on_stubbing_method(:public, Class.new.new) + assert_snapshot_unchanged_on_stubbing(:public, Class.new.new) end def test_should_stub_protected_method_and_leave_it_unchanged_after_test - assert_snapshot_unchanged_on_stubbing_method(:protected, Class.new.new) + assert_snapshot_unchanged_on_stubbing(:protected, Class.new.new) end def test_should_stub_private_method_and_leave_it_unchanged_after_test - assert_snapshot_unchanged_on_stubbing_method(:private, Class.new.new) + assert_snapshot_unchanged_on_stubbing(:private, Class.new.new) end def test_should_stub_public_module_method_and_leave_it_unchanged_after_test - assert_snapshot_unchanged_on_stubbing_method(:public, Module.new) + assert_snapshot_unchanged_on_stubbing(:public, Module.new) end def test_should_stub_protected_module_method_and_leave_it_unchanged_after_test - assert_snapshot_unchanged_on_stubbing_method(:protected, Module.new) + assert_snapshot_unchanged_on_stubbing(:protected, Module.new) end def test_should_stub_private_module_method_and_leave_it_unchanged_after_test - assert_snapshot_unchanged_on_stubbing_method(:private, Module.new) + assert_snapshot_unchanged_on_stubbing(:private, Module.new) end - def assert_snapshot_unchanged_on_stubbing_method(visibility, instance) + def assert_snapshot_unchanged_on_stubbing(visibility, instance) Kernel.send(visibility, :my_instance_method) assert_snapshot_unchanged(instance) do test_result = run_as_test do From 2e425af905a5ce335375ccced08233978c3b6320 Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Fri, 3 Jan 2020 17:51:12 +0000 Subject: [PATCH 11/33] extract & reuse StubInstanceMethodSharedTests --- ...ce_method_defined_on_kernel_module_test.rb | 39 +--------- ...nce_method_defined_on_object_class_test.rb | 74 +------------------ .../stub_instance_method_shared_tests.rb | 40 ++++++++++ 3 files changed, 48 insertions(+), 105 deletions(-) create mode 100644 test/acceptance/stub_instance_method_shared_tests.rb diff --git a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb index 64f2a70fc..50175fba4 100644 --- a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb @@ -1,28 +1,10 @@ -require File.expand_path('../acceptance_test_helper', __FILE__) +require File.expand_path('../stub_instance_method_shared_tests', __FILE__) class StubInstanceMethodDefinedOnKernelModuleTest < Mocha::TestCase - include AcceptanceTest + include StubInstanceMethodSharedTests - def setup - setup_acceptance_test - Kernel.send(:define_method, :my_instance_method) { :original_return_value } - end - - def teardown - Kernel.send(:remove_method, :my_instance_method) - teardown_acceptance_test - end - - def test_should_stub_public_method_and_leave_it_unchanged_after_test - assert_snapshot_unchanged_on_stubbing(:public, Class.new.new) - end - - def test_should_stub_protected_method_and_leave_it_unchanged_after_test - assert_snapshot_unchanged_on_stubbing(:protected, Class.new.new) - end - - def test_should_stub_private_method_and_leave_it_unchanged_after_test - assert_snapshot_unchanged_on_stubbing(:private, Class.new.new) + def stubbed_module + Kernel end def test_should_stub_public_module_method_and_leave_it_unchanged_after_test @@ -36,17 +18,4 @@ def test_should_stub_protected_module_method_and_leave_it_unchanged_after_test def test_should_stub_private_module_method_and_leave_it_unchanged_after_test assert_snapshot_unchanged_on_stubbing(:private, Module.new) end - - def assert_snapshot_unchanged_on_stubbing(visibility, instance) - Kernel.send(visibility, :my_instance_method) - assert_snapshot_unchanged(instance) do - test_result = run_as_test do - instance.stubs(:my_instance_method).returns(:new_return_value) - assert_method_visibility instance, :my_instance_method, visibility - assert_equal :new_return_value, instance.send(:my_instance_method) - end - assert_passed(test_result) - end - assert_equal :original_return_value, instance.send(:my_instance_method) - end end diff --git a/test/acceptance/stub_instance_method_defined_on_object_class_test.rb b/test/acceptance/stub_instance_method_defined_on_object_class_test.rb index ad25df2b3..2db12df3e 100644 --- a/test/acceptance/stub_instance_method_defined_on_object_class_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_object_class_test.rb @@ -1,75 +1,9 @@ -require File.expand_path('../acceptance_test_helper', __FILE__) +require File.expand_path('../stub_instance_method_shared_tests', __FILE__) class StubInstanceMethodDefinedOnObjectClassTest < Mocha::TestCase - include AcceptanceTest + include StubInstanceMethodSharedTests - def setup - setup_acceptance_test + def stubbed_module + Object end - - def teardown - teardown_acceptance_test - end - - # rubocop:disable Lint/DuplicateMethods - def test_should_stub_public_method_and_leave_it_unchanged_after_test - Object.class_eval do - def my_instance_method - :original_return_value - end - public :my_instance_method - end - instance = Class.new.new - assert_snapshot_unchanged(instance) do - test_result = run_as_test do - instance.stubs(:my_instance_method).returns(:new_return_value) - assert_equal :new_return_value, instance.my_instance_method - end - assert_passed(test_result) - end - assert_equal :original_return_value, instance.my_instance_method - ensure - Object.class_eval { remove_method :my_instance_method } - end - - def test_should_stub_protected_method_and_leave_it_unchanged_after_test - Object.class_eval do - def my_instance_method - :original_return_value - end - protected :my_instance_method - end - instance = Class.new.new - assert_snapshot_unchanged(instance) do - test_result = run_as_test do - instance.stubs(:my_instance_method).returns(:new_return_value) - assert_equal :new_return_value, instance.send(:my_instance_method) - end - assert_passed(test_result) - end - assert_equal :original_return_value, instance.send(:my_instance_method) - ensure - Object.class_eval { remove_method :my_instance_method } - end - - def test_should_stub_private_method_and_leave_it_unchanged_after_test - Object.class_eval do - def my_instance_method - :original_return_value - end - private :my_instance_method - end - instance = Class.new.new - assert_snapshot_unchanged(instance) do - test_result = run_as_test do - instance.stubs(:my_instance_method).returns(:new_return_value) - assert_equal :new_return_value, instance.send(:my_instance_method) - end - assert_passed(test_result) - end - assert_equal :original_return_value, instance.send(:my_instance_method) - ensure - Object.class_eval { remove_method :my_instance_method } - end - # rubocop:enable Lint/DuplicateMethods end diff --git a/test/acceptance/stub_instance_method_shared_tests.rb b/test/acceptance/stub_instance_method_shared_tests.rb new file mode 100644 index 000000000..341ad0cc5 --- /dev/null +++ b/test/acceptance/stub_instance_method_shared_tests.rb @@ -0,0 +1,40 @@ +require File.expand_path('../acceptance_test_helper', __FILE__) + +module StubInstanceMethodSharedTests + include AcceptanceTest + + def setup + setup_acceptance_test + stubbed_module.send(:define_method, :my_instance_method) { :original_return_value } + end + + def teardown + stubbed_module.send(:remove_method, :my_instance_method) + teardown_acceptance_test + end + + def test_should_stub_public_method_and_leave_it_unchanged_after_test + assert_snapshot_unchanged_on_stubbing(:public, Class.new.new) + end + + def test_should_stub_protected_method_and_leave_it_unchanged_after_test + assert_snapshot_unchanged_on_stubbing(:protected, Class.new.new) + end + + def test_should_stub_private_method_and_leave_it_unchanged_after_test + assert_snapshot_unchanged_on_stubbing(:private, Class.new.new) + end + + def assert_snapshot_unchanged_on_stubbing(visibility, instance) + stubbed_module.send(visibility, :my_instance_method) + assert_snapshot_unchanged(instance) do + test_result = run_as_test do + instance.stubs(:my_instance_method).returns(:new_return_value) + assert_method_visibility instance, :my_instance_method, visibility + assert_equal :new_return_value, instance.send(:my_instance_method) + end + assert_passed(test_result) + end + assert_equal :original_return_value, instance.send(:my_instance_method) + end +end From 0d024d40f52bc5c3740c6d9600d8c6da19bd0004 Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Fri, 3 Jan 2020 18:14:21 +0000 Subject: [PATCH 12/33] allow instantiation to be parameterized by subclassing This will allow us to reuse StubInstanceMethodSharedTests in StubInstanceMethodDefinedOnClassTest (and perhaps others) --- .../stub_instance_method_defined_on_kernel_module_test.rb | 4 ++++ .../stub_instance_method_defined_on_object_class_test.rb | 4 ++++ test/acceptance/stub_instance_method_shared_tests.rb | 8 ++++---- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb index 50175fba4..ef481aebf 100644 --- a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb @@ -7,6 +7,10 @@ def stubbed_module Kernel end + def stubbed_class + Class.new + end + def test_should_stub_public_module_method_and_leave_it_unchanged_after_test assert_snapshot_unchanged_on_stubbing(:public, Module.new) end diff --git a/test/acceptance/stub_instance_method_defined_on_object_class_test.rb b/test/acceptance/stub_instance_method_defined_on_object_class_test.rb index 2db12df3e..2533b17c5 100644 --- a/test/acceptance/stub_instance_method_defined_on_object_class_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_object_class_test.rb @@ -6,4 +6,8 @@ class StubInstanceMethodDefinedOnObjectClassTest < Mocha::TestCase def stubbed_module Object end + + def stubbed_class + Class.new + end end diff --git a/test/acceptance/stub_instance_method_shared_tests.rb b/test/acceptance/stub_instance_method_shared_tests.rb index 341ad0cc5..6d83893c0 100644 --- a/test/acceptance/stub_instance_method_shared_tests.rb +++ b/test/acceptance/stub_instance_method_shared_tests.rb @@ -14,18 +14,18 @@ def teardown end def test_should_stub_public_method_and_leave_it_unchanged_after_test - assert_snapshot_unchanged_on_stubbing(:public, Class.new.new) + assert_snapshot_unchanged_on_stubbing(:public) end def test_should_stub_protected_method_and_leave_it_unchanged_after_test - assert_snapshot_unchanged_on_stubbing(:protected, Class.new.new) + assert_snapshot_unchanged_on_stubbing(:protected) end def test_should_stub_private_method_and_leave_it_unchanged_after_test - assert_snapshot_unchanged_on_stubbing(:private, Class.new.new) + assert_snapshot_unchanged_on_stubbing(:private) end - def assert_snapshot_unchanged_on_stubbing(visibility, instance) + def assert_snapshot_unchanged_on_stubbing(visibility, instance=stubbed_class.new) stubbed_module.send(visibility, :my_instance_method) assert_snapshot_unchanged(instance) do test_result = run_as_test do From 44037fef194804f998884ef82e895c9597101155 Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Fri, 3 Jan 2020 18:21:29 +0000 Subject: [PATCH 13/33] reuse StubInstanceMethodSharedTests in StubInstanceMethodDefinedOnClassTest --- ...b_instance_method_defined_on_class_test.rb | 66 ++----------------- 1 file changed, 6 insertions(+), 60 deletions(-) diff --git a/test/acceptance/stub_instance_method_defined_on_class_test.rb b/test/acceptance/stub_instance_method_defined_on_class_test.rb index 2da879736..ea70406df 100644 --- a/test/acceptance/stub_instance_method_defined_on_class_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_class_test.rb @@ -1,67 +1,13 @@ -require File.expand_path('../acceptance_test_helper', __FILE__) +require File.expand_path('../stub_instance_method_shared_tests', __FILE__) class StubInstanceMethodDefinedOnClassTest < Mocha::TestCase - include AcceptanceTest + include StubInstanceMethodSharedTests - def setup - setup_acceptance_test + def stubbed_module + @stubbed_module ||= Class.new end - def teardown - teardown_acceptance_test - end - - def test_should_stub_public_method_and_leave_it_unchanged_after_test - instance = Class.new do - def my_instance_method - :original_return_value - end - public :my_instance_method - end.new - assert_snapshot_unchanged(instance) do - test_result = run_as_test do - instance.stubs(:my_instance_method).returns(:new_return_value) - assert_method_visibility instance, :my_instance_method, :public - assert_equal :new_return_value, instance.my_instance_method - end - assert_passed(test_result) - end - assert_equal :original_return_value, instance.my_instance_method - end - - def test_should_stub_protected_method_and_leave_it_unchanged_after_test - instance = Class.new do - def my_instance_method - :original_return_value - end - protected :my_instance_method - end.new - assert_snapshot_unchanged(instance) do - test_result = run_as_test do - instance.stubs(:my_instance_method).returns(:new_return_value) - assert_method_visibility instance, :my_instance_method, :protected - assert_equal :new_return_value, instance.send(:my_instance_method) - end - assert_passed(test_result) - end - assert_equal :original_return_value, instance.send(:my_instance_method) - end - - def test_should_stub_private_method_and_leave_it_unchanged_after_test - instance = Class.new do - def my_instance_method - :original_return_value - end - private :my_instance_method - end.new - assert_snapshot_unchanged(instance) do - test_result = run_as_test do - instance.stubs(:my_instance_method).returns(:new_return_value) - assert_method_visibility instance, :my_instance_method, :private - assert_equal :new_return_value, instance.send(:my_instance_method) - end - assert_passed(test_result) - end - assert_equal :original_return_value, instance.send(:my_instance_method) + def stubbed_class + stubbed_module end end From 388c60839df62e369cf66682466785f0ce0456a0 Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Fri, 3 Jan 2020 18:21:42 +0000 Subject: [PATCH 14/33] reuse StubInstanceMethodSharedTests in StubInstanceMethodDefinedOnModuleTest --- ..._instance_method_defined_on_module_test.rb | 75 ++----------------- 1 file changed, 6 insertions(+), 69 deletions(-) diff --git a/test/acceptance/stub_instance_method_defined_on_module_test.rb b/test/acceptance/stub_instance_method_defined_on_module_test.rb index 74df84447..389336660 100644 --- a/test/acceptance/stub_instance_method_defined_on_module_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_module_test.rb @@ -1,76 +1,13 @@ -require File.expand_path('../acceptance_test_helper', __FILE__) +require File.expand_path('../stub_instance_method_shared_tests', __FILE__) class StubInstanceMethodDefinedOnModuleTest < Mocha::TestCase - include AcceptanceTest + include StubInstanceMethodSharedTests - def setup - setup_acceptance_test + def stubbed_module + @stubbed_module ||= Module.new end - def teardown - teardown_acceptance_test - end - - def test_should_stub_public_method_and_leave_it_unchanged_after_test - mod = Module.new do - def my_module_method - :original_return_value - end - public :my_module_method - end - instance = Class.new do - include mod - end.new - assert_snapshot_unchanged(instance) do - test_result = run_as_test do - instance.stubs(:my_module_method).returns(:new_return_value) - assert_method_visibility instance, :my_module_method, :public - assert_equal :new_return_value, instance.my_module_method - end - assert_passed(test_result) - end - assert_equal :original_return_value, instance.my_module_method - end - - def test_should_stub_protected_method_and_leave_it_unchanged_after_test - mod = Module.new do - def my_module_method - :original_return_value - end - protected :my_module_method - end - instance = Class.new do - include mod - end.new - assert_snapshot_unchanged(instance) do - test_result = run_as_test do - instance.stubs(:my_module_method).returns(:new_return_value) - assert_method_visibility instance, :my_module_method, :protected - assert_equal :new_return_value, instance.send(:my_module_method) - end - assert_passed(test_result) - end - assert_equal :original_return_value, instance.send(:my_module_method) - end - - def test_should_stub_private_method_and_leave_it_unchanged_after_test - mod = Module.new do - def my_module_method - :original_return_value - end - private :my_module_method - end - instance = Class.new do - include mod - end.new - assert_snapshot_unchanged(instance) do - test_result = run_as_test do - instance.stubs(:my_module_method).returns(:new_return_value) - assert_method_visibility instance, :my_module_method, :private - assert_equal :new_return_value, instance.send(:my_module_method) - end - assert_passed(test_result) - end - assert_equal :original_return_value, instance.send(:my_module_method) + def stubbed_class + Class.new.send(:include, stubbed_module) end end From b8505d1da97dd85c32909410866d2e327fe5fbcf Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Fri, 3 Jan 2020 18:24:41 +0000 Subject: [PATCH 15/33] reuse StubInstanceMethodSharedTests in StubInstanceMethodDefinedOnSuperclassTest --- ...tance_method_defined_on_superclass_test.rb | 69 ++----------------- 1 file changed, 6 insertions(+), 63 deletions(-) diff --git a/test/acceptance/stub_instance_method_defined_on_superclass_test.rb b/test/acceptance/stub_instance_method_defined_on_superclass_test.rb index 38ec5d077..4ace799e5 100644 --- a/test/acceptance/stub_instance_method_defined_on_superclass_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_superclass_test.rb @@ -1,70 +1,13 @@ -require File.expand_path('../acceptance_test_helper', __FILE__) +require File.expand_path('../stub_instance_method_shared_tests', __FILE__) class StubInstanceMethodDefinedOnSuperclassTest < Mocha::TestCase - include AcceptanceTest + include StubInstanceMethodSharedTests - def setup - setup_acceptance_test + def stubbed_module + @stubbed_module ||= Class.new end - def teardown - teardown_acceptance_test - end - - def test_should_stub_public_method_and_leave_it_unchanged_after_test - superklass = Class.new do - def my_superclass_method - :original_return_value - end - public :my_superclass_method - end - klass = Class.new(superklass) - instance = klass.new - assert_snapshot_unchanged(instance) do - test_result = run_as_test do - instance.stubs(:my_superclass_method).returns(:new_return_value) - assert_equal :new_return_value, instance.my_superclass_method - end - assert_passed(test_result) - end - assert_equal :original_return_value, instance.my_superclass_method - end - - def test_should_stub_protected_method_and_leave_it_unchanged_after_test - superklass = Class.new do - def my_superclass_method - :original_return_value - end - protected :my_superclass_method - end - klass = Class.new(superklass) - instance = klass.new - assert_snapshot_unchanged(instance) do - test_result = run_as_test do - instance.stubs(:my_superclass_method).returns(:new_return_value) - assert_equal :new_return_value, instance.send(:my_superclass_method) - end - assert_passed(test_result) - end - assert_equal :original_return_value, instance.send(:my_superclass_method) - end - - def test_should_stub_private_method_and_leave_it_unchanged_after_test - superklass = Class.new do - def my_superclass_method - :original_return_value - end - private :my_superclass_method - end - klass = Class.new(superklass) - instance = klass.new - assert_snapshot_unchanged(instance) do - test_result = run_as_test do - instance.stubs(:my_superclass_method).returns(:new_return_value) - assert_equal :new_return_value, instance.send(:my_superclass_method) - end - assert_passed(test_result) - end - assert_equal :original_return_value, instance.send(:my_superclass_method) + def stubbed_class + Class.new(stubbed_module) end end From 60036df1995f04c364c55fe961a9235569fde13c Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Fri, 3 Jan 2020 18:51:27 +0000 Subject: [PATCH 16/33] more expressive name: stubbed_module -> method_owner --- .../stub_instance_method_defined_on_class_test.rb | 6 +++--- .../stub_instance_method_defined_on_kernel_module_test.rb | 2 +- .../stub_instance_method_defined_on_module_test.rb | 6 +++--- .../stub_instance_method_defined_on_object_class_test.rb | 2 +- .../stub_instance_method_defined_on_superclass_test.rb | 6 +++--- test/acceptance/stub_instance_method_shared_tests.rb | 6 +++--- 6 files changed, 14 insertions(+), 14 deletions(-) diff --git a/test/acceptance/stub_instance_method_defined_on_class_test.rb b/test/acceptance/stub_instance_method_defined_on_class_test.rb index ea70406df..26b34a12a 100644 --- a/test/acceptance/stub_instance_method_defined_on_class_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_class_test.rb @@ -3,11 +3,11 @@ class StubInstanceMethodDefinedOnClassTest < Mocha::TestCase include StubInstanceMethodSharedTests - def stubbed_module - @stubbed_module ||= Class.new + def method_owner + @method_owner ||= Class.new end def stubbed_class - stubbed_module + method_owner end end diff --git a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb index ef481aebf..2f43a2b87 100644 --- a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb @@ -3,7 +3,7 @@ class StubInstanceMethodDefinedOnKernelModuleTest < Mocha::TestCase include StubInstanceMethodSharedTests - def stubbed_module + def method_owner Kernel end diff --git a/test/acceptance/stub_instance_method_defined_on_module_test.rb b/test/acceptance/stub_instance_method_defined_on_module_test.rb index 389336660..bdcc0e7fc 100644 --- a/test/acceptance/stub_instance_method_defined_on_module_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_module_test.rb @@ -3,11 +3,11 @@ class StubInstanceMethodDefinedOnModuleTest < Mocha::TestCase include StubInstanceMethodSharedTests - def stubbed_module - @stubbed_module ||= Module.new + def method_owner + @method_owner ||= Module.new end def stubbed_class - Class.new.send(:include, stubbed_module) + Class.new.send(:include, method_owner) end end diff --git a/test/acceptance/stub_instance_method_defined_on_object_class_test.rb b/test/acceptance/stub_instance_method_defined_on_object_class_test.rb index 2533b17c5..4e417a0e8 100644 --- a/test/acceptance/stub_instance_method_defined_on_object_class_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_object_class_test.rb @@ -3,7 +3,7 @@ class StubInstanceMethodDefinedOnObjectClassTest < Mocha::TestCase include StubInstanceMethodSharedTests - def stubbed_module + def method_owner Object end diff --git a/test/acceptance/stub_instance_method_defined_on_superclass_test.rb b/test/acceptance/stub_instance_method_defined_on_superclass_test.rb index 4ace799e5..66a2d03c7 100644 --- a/test/acceptance/stub_instance_method_defined_on_superclass_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_superclass_test.rb @@ -3,11 +3,11 @@ class StubInstanceMethodDefinedOnSuperclassTest < Mocha::TestCase include StubInstanceMethodSharedTests - def stubbed_module - @stubbed_module ||= Class.new + def method_owner + @method_owner ||= Class.new end def stubbed_class - Class.new(stubbed_module) + Class.new(method_owner) end end diff --git a/test/acceptance/stub_instance_method_shared_tests.rb b/test/acceptance/stub_instance_method_shared_tests.rb index 6d83893c0..4e26079ad 100644 --- a/test/acceptance/stub_instance_method_shared_tests.rb +++ b/test/acceptance/stub_instance_method_shared_tests.rb @@ -5,11 +5,11 @@ module StubInstanceMethodSharedTests def setup setup_acceptance_test - stubbed_module.send(:define_method, :my_instance_method) { :original_return_value } + method_owner.send(:define_method, :my_instance_method) { :original_return_value } end def teardown - stubbed_module.send(:remove_method, :my_instance_method) + method_owner.send(:remove_method, :my_instance_method) teardown_acceptance_test end @@ -26,7 +26,7 @@ def test_should_stub_private_method_and_leave_it_unchanged_after_test end def assert_snapshot_unchanged_on_stubbing(visibility, instance=stubbed_class.new) - stubbed_module.send(visibility, :my_instance_method) + method_owner.send(visibility, :my_instance_method) assert_snapshot_unchanged(instance) do test_result = run_as_test do instance.stubs(:my_instance_method).returns(:new_return_value) From e9cfc66181aee36d48d9c757f4c91fad840ba077 Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Fri, 3 Jan 2020 19:01:17 +0000 Subject: [PATCH 17/33] split StubInstanceMethodDefinedOnKernelModuleTest into two This allows us to reuse StubInstanceMethodSharedTests for checking stubbing on a Module and stubbing on an object --- ...nce_method_defined_on_kernel_module_test.rb | 18 +++++++----------- .../stub_instance_method_shared_tests.rb | 3 ++- 2 files changed, 9 insertions(+), 12 deletions(-) diff --git a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb index 2f43a2b87..81a04f8f3 100644 --- a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb @@ -1,8 +1,6 @@ require File.expand_path('../stub_instance_method_shared_tests', __FILE__) -class StubInstanceMethodDefinedOnKernelModuleTest < Mocha::TestCase - include StubInstanceMethodSharedTests - +class StubInstanceMethodDefinedOnKernelStubbedOnAnObjectTest < Mocha::TestCase def method_owner Kernel end @@ -10,16 +8,14 @@ def method_owner def stubbed_class Class.new end +end - def test_should_stub_public_module_method_and_leave_it_unchanged_after_test - assert_snapshot_unchanged_on_stubbing(:public, Module.new) - end - - def test_should_stub_protected_module_method_and_leave_it_unchanged_after_test - assert_snapshot_unchanged_on_stubbing(:protected, Module.new) +class StubInstanceMethodDefinedOnKernelStubbedOnAModuleTest < Mocha::TestCase + def method_owner + Kernel end - def test_should_stub_private_module_method_and_leave_it_unchanged_after_test - assert_snapshot_unchanged_on_stubbing(:private, Module.new) + def stubbed_class + Module end end diff --git a/test/acceptance/stub_instance_method_shared_tests.rb b/test/acceptance/stub_instance_method_shared_tests.rb index 4e26079ad..abf9c8f4b 100644 --- a/test/acceptance/stub_instance_method_shared_tests.rb +++ b/test/acceptance/stub_instance_method_shared_tests.rb @@ -25,8 +25,9 @@ def test_should_stub_private_method_and_leave_it_unchanged_after_test assert_snapshot_unchanged_on_stubbing(:private) end - def assert_snapshot_unchanged_on_stubbing(visibility, instance=stubbed_class.new) + def assert_snapshot_unchanged_on_stubbing(visibility) method_owner.send(visibility, :my_instance_method) + instance = stubbed_class.new assert_snapshot_unchanged(instance) do test_result = run_as_test do instance.stubs(:my_instance_method).returns(:new_return_value) From eef38809e9cebec7e83b83c379c3e769610dacb2 Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Fri, 3 Jan 2020 19:19:23 +0000 Subject: [PATCH 18/33] return stubbed instance instead of stubbed class This will allow us to reuse StubInstanceMethodSharedTests in StubInstanceMethodDefinedOnSingletonClass as instead of creating an instance from a class there, we obtain the (singleton) class from the instance. --- .../stub_instance_method_defined_on_class_test.rb | 4 ++-- .../stub_instance_method_defined_on_kernel_module_test.rb | 8 ++++---- .../stub_instance_method_defined_on_module_test.rb | 4 ++-- .../stub_instance_method_defined_on_object_class_test.rb | 4 ++-- .../stub_instance_method_defined_on_superclass_test.rb | 4 ++-- test/acceptance/stub_instance_method_shared_tests.rb | 2 +- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/test/acceptance/stub_instance_method_defined_on_class_test.rb b/test/acceptance/stub_instance_method_defined_on_class_test.rb index 26b34a12a..af1caeaee 100644 --- a/test/acceptance/stub_instance_method_defined_on_class_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_class_test.rb @@ -7,7 +7,7 @@ def method_owner @method_owner ||= Class.new end - def stubbed_class - method_owner + def stubbed_instance + method_owner.new end end diff --git a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb index 81a04f8f3..4bd6974c9 100644 --- a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb @@ -5,8 +5,8 @@ def method_owner Kernel end - def stubbed_class - Class.new + def stubbed_instance + Class.new.new end end @@ -15,7 +15,7 @@ def method_owner Kernel end - def stubbed_class - Module + def stubbed_instance + Module.new end end diff --git a/test/acceptance/stub_instance_method_defined_on_module_test.rb b/test/acceptance/stub_instance_method_defined_on_module_test.rb index bdcc0e7fc..17bffee86 100644 --- a/test/acceptance/stub_instance_method_defined_on_module_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_module_test.rb @@ -7,7 +7,7 @@ def method_owner @method_owner ||= Module.new end - def stubbed_class - Class.new.send(:include, method_owner) + def stubbed_instance + Class.new.send(:include, method_owner).new end end diff --git a/test/acceptance/stub_instance_method_defined_on_object_class_test.rb b/test/acceptance/stub_instance_method_defined_on_object_class_test.rb index 4e417a0e8..e52d04446 100644 --- a/test/acceptance/stub_instance_method_defined_on_object_class_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_object_class_test.rb @@ -7,7 +7,7 @@ def method_owner Object end - def stubbed_class - Class.new + def stubbed_instance + Class.new.new end end diff --git a/test/acceptance/stub_instance_method_defined_on_superclass_test.rb b/test/acceptance/stub_instance_method_defined_on_superclass_test.rb index 66a2d03c7..50003fe1b 100644 --- a/test/acceptance/stub_instance_method_defined_on_superclass_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_superclass_test.rb @@ -7,7 +7,7 @@ def method_owner @method_owner ||= Class.new end - def stubbed_class - Class.new(method_owner) + def stubbed_instance + Class.new(method_owner).new end end diff --git a/test/acceptance/stub_instance_method_shared_tests.rb b/test/acceptance/stub_instance_method_shared_tests.rb index abf9c8f4b..ecefa3b2e 100644 --- a/test/acceptance/stub_instance_method_shared_tests.rb +++ b/test/acceptance/stub_instance_method_shared_tests.rb @@ -27,7 +27,7 @@ def test_should_stub_private_method_and_leave_it_unchanged_after_test def assert_snapshot_unchanged_on_stubbing(visibility) method_owner.send(visibility, :my_instance_method) - instance = stubbed_class.new + instance = stubbed_instance assert_snapshot_unchanged(instance) do test_result = run_as_test do instance.stubs(:my_instance_method).returns(:new_return_value) From a84b186ec3bfd7a43a5cf756677b752d22a4db99 Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Fri, 3 Jan 2020 19:21:55 +0000 Subject: [PATCH 19/33] reuse StubInstanceMethodSharedTests in StubInstanceMethodDefinedOnSingletonClass --- ..._method_defined_on_singleton_class_test.rb | 66 ++----------------- 1 file changed, 6 insertions(+), 60 deletions(-) diff --git a/test/acceptance/stub_instance_method_defined_on_singleton_class_test.rb b/test/acceptance/stub_instance_method_defined_on_singleton_class_test.rb index c08373f34..2e8cd4b60 100644 --- a/test/acceptance/stub_instance_method_defined_on_singleton_class_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_singleton_class_test.rb @@ -1,67 +1,13 @@ -require File.expand_path('../acceptance_test_helper', __FILE__) +require File.expand_path('../stub_instance_method_shared_tests', __FILE__) class StubInstanceMethodDefinedOnSingletonClassTest < Mocha::TestCase - include AcceptanceTest + include StubInstanceMethodSharedTests - def setup - setup_acceptance_test + def method_owner + stubbed_instance.singleton_class end - def teardown - teardown_acceptance_test - end - - def test_should_stub_public_method_and_leave_it_unchanged_after_test - instance = Class.new.new - class << instance - def my_singleton_method - :original_return_value - end - public :my_singleton_method - end - assert_snapshot_unchanged(instance) do - test_result = run_as_test do - instance.stubs(:my_singleton_method).returns(:stubbed_return_value) - assert_equal :stubbed_return_value, instance.my_singleton_method - end - assert_passed(test_result) - end - assert_equal :original_return_value, instance.my_singleton_method - end - - def test_should_stub_protected_method_and_leave_it_unchanged_after_test - instance = Class.new.new - class << instance - def my_singleton_method - :original_return_value - end - protected :my_singleton_method - end - assert_snapshot_unchanged(instance) do - test_result = run_as_test do - instance.stubs(:my_singleton_method).returns(:stubbed_return_value) - assert_equal :stubbed_return_value, instance.send(:my_singleton_method) - end - assert_passed(test_result) - end - assert_equal :original_return_value, instance.send(:my_singleton_method) - end - - def test_should_stub_private_method_and_leave_it_unchanged_after_test - instance = Class.new.new - class << instance - def my_singleton_method - :original_return_value - end - private :my_singleton_method - end - assert_snapshot_unchanged(instance) do - test_result = run_as_test do - instance.stubs(:my_singleton_method).returns(:stubbed_return_value) - assert_equal :stubbed_return_value, instance.send(:my_singleton_method) - end - assert_passed(test_result) - end - assert_equal :original_return_value, instance.send(:my_singleton_method) + def stubbed_instance + @stubbed_instance ||= Class.new.new end end From adc1d2fcbeefc200df45fc0a254dd3029d345b66 Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Fri, 3 Jan 2020 22:00:15 +0000 Subject: [PATCH 20/33] check aliased method stubbing if stub_aliased_method --- .../stub_instance_method_shared_tests.rb | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/test/acceptance/stub_instance_method_shared_tests.rb b/test/acceptance/stub_instance_method_shared_tests.rb index ecefa3b2e..1b1fcdc9e 100644 --- a/test/acceptance/stub_instance_method_shared_tests.rb +++ b/test/acceptance/stub_instance_method_shared_tests.rb @@ -9,6 +9,7 @@ def setup end def teardown + method_owner.send(:remove_method, :my_aliased_method) if method_owner.method_defined?(:my_aliased_method) method_owner.send(:remove_method, :my_instance_method) teardown_acceptance_test end @@ -27,15 +28,21 @@ def test_should_stub_private_method_and_leave_it_unchanged_after_test def assert_snapshot_unchanged_on_stubbing(visibility) method_owner.send(visibility, :my_instance_method) + method_owner.send(:alias_method, :my_aliased_method, :my_instance_method) if alias_method? instance = stubbed_instance + method = alias_method? ? :my_aliased_method : :my_instance_method assert_snapshot_unchanged(instance) do test_result = run_as_test do - instance.stubs(:my_instance_method).returns(:new_return_value) - assert_method_visibility instance, :my_instance_method, visibility - assert_equal :new_return_value, instance.send(:my_instance_method) + instance.stubs(method).returns(:new_return_value) + assert_method_visibility instance, method, visibility + assert_equal :new_return_value, instance.send(method) end assert_passed(test_result) end - assert_equal :original_return_value, instance.send(:my_instance_method) + assert_equal :original_return_value, instance.send(method) + end + + def alias_method? + false end end From bffb23d785fcd6cc824ce9a9466861d899aae78d Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Fri, 3 Jan 2020 22:10:05 +0000 Subject: [PATCH 21/33] reuse StubInstanceMethodSharedTests in StubInstanceMethodDefinedOnClassAndAliasedTest --- ...ethod_defined_on_class_and_aliased_test.rb | 67 ------------------- ...b_instance_method_defined_on_class_test.rb | 6 ++ 2 files changed, 6 insertions(+), 67 deletions(-) delete mode 100644 test/acceptance/stub_instance_method_defined_on_class_and_aliased_test.rb diff --git a/test/acceptance/stub_instance_method_defined_on_class_and_aliased_test.rb b/test/acceptance/stub_instance_method_defined_on_class_and_aliased_test.rb deleted file mode 100644 index 001b4d8e3..000000000 --- a/test/acceptance/stub_instance_method_defined_on_class_and_aliased_test.rb +++ /dev/null @@ -1,67 +0,0 @@ -require File.expand_path('../acceptance_test_helper', __FILE__) - -class StubInstanceMethodDefinedOnClassAndAliasedTest < Mocha::TestCase - include AcceptanceTest - - def setup - setup_acceptance_test - end - - def teardown - teardown_acceptance_test - end - - def test_should_stub_public_method_and_leave_it_unchanged_after_test - instance = Class.new do - def my_instance_method - :original_return_value - end - public :my_instance_method - alias_method :my_aliased_method, :my_instance_method - end.new - assert_snapshot_unchanged(instance) do - test_result = run_as_test do - instance.stubs(:my_aliased_method).returns(:new_return_value) - assert_equal :new_return_value, instance.my_aliased_method - end - assert_passed(test_result) - end - assert_equal :original_return_value, instance.my_aliased_method - end - - def test_should_stub_protected_method_and_leave_it_unchanged_after_test - instance = Class.new do - def my_instance_method - :original_return_value - end - protected :my_instance_method - alias_method :my_aliased_method, :my_instance_method - end.new - assert_snapshot_unchanged(instance) do - test_result = run_as_test do - instance.stubs(:my_aliased_method).returns(:new_return_value) - assert_equal :new_return_value, instance.send(:my_aliased_method) - end - assert_passed(test_result) - end - assert_equal :original_return_value, instance.send(:my_aliased_method) - end - - def test_should_stub_private_method_and_leave_it_unchanged_after_test - instance = Class.new do - def my_instance_method - :original_return_value - end - private :my_instance_method - alias_method :my_aliased_method, :my_instance_method - end.new - assert_snapshot_unchanged(instance) do - test_result = run_as_test do - instance.stubs(:my_aliased_method).returns(:new_return_value) - assert_equal :new_return_value, instance.send(:my_aliased_method) - end - assert_passed(test_result) - end - assert_equal :original_return_value, instance.send(:my_aliased_method) - end -end diff --git a/test/acceptance/stub_instance_method_defined_on_class_test.rb b/test/acceptance/stub_instance_method_defined_on_class_test.rb index af1caeaee..200c1c074 100644 --- a/test/acceptance/stub_instance_method_defined_on_class_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_class_test.rb @@ -11,3 +11,9 @@ def stubbed_instance method_owner.new end end + +class StubInstanceMethodDefinedOnClassAndAliasedTest < StubInstanceMethodDefinedOnClassTest + def alias_method? + true + end +end From 1180f772ef769c080065b0d5b98ca6b271cb1b10 Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Fri, 3 Jan 2020 22:26:03 +0000 Subject: [PATCH 22/33] reuse StubInstanceMethodSharedTests in StubMethodDefinedOnModuleAndAliasedTest --- ...thod_defined_on_module_and_aliased_test.rb | 35 +++++-------------- 1 file changed, 8 insertions(+), 27 deletions(-) diff --git a/test/acceptance/stub_method_defined_on_module_and_aliased_test.rb b/test/acceptance/stub_method_defined_on_module_and_aliased_test.rb index e7f607502..a8d58b51f 100644 --- a/test/acceptance/stub_method_defined_on_module_and_aliased_test.rb +++ b/test/acceptance/stub_method_defined_on_module_and_aliased_test.rb @@ -1,38 +1,19 @@ -require File.expand_path('../acceptance_test_helper', __FILE__) +require File.expand_path('../stub_instance_method_shared_tests', __FILE__) unless Mocha::PRE_RUBY_V19 class StubMethodDefinedOnModuleAndAliasedTest < Mocha::TestCase - include AcceptanceTest + include StubInstanceMethodSharedTests - def setup - setup_acceptance_test + def method_owner + @method_owner ||= Module.new end - def teardown - teardown_acceptance_test + def stubbed_instance + Class.new.extend(method_owner) end - def test_stubbing_class_method_defined_by_aliasing_module_instance_method - mod = Module.new do - def module_instance_method - 'module-instance-method' - end - end - - klass = Class.new do - extend mod - class << self - alias_method :aliased_module_instance_method, :module_instance_method - end - end - - assert_snapshot_unchanged(klass) do - test_result = run_as_test do - klass.stubs(:aliased_module_instance_method).returns('stubbed-aliased-module-instance-method') - assert_equal 'stubbed-aliased-module-instance-method', klass.aliased_module_instance_method - end - assert_passed(test_result) - end + def alias_method? + true end end end From ba0617b907b6dae9d0e29635b32a5ca5f8f0c8c0 Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Sun, 5 Jan 2020 18:30:02 +0000 Subject: [PATCH 23/33] reuse StubInstanceMethodSharedTests in StubClassMethod*Test ...since class methods are just instance methods of the singleton class of class --- ...stub_class_method_defined_on_class_test.rb | 77 ++----------------- ...tub_class_method_defined_on_module_test.rb | 72 ++--------------- ...class_method_defined_on_superclass_test.rb | 72 ++--------------- 3 files changed, 18 insertions(+), 203 deletions(-) diff --git a/test/acceptance/stub_class_method_defined_on_class_test.rb b/test/acceptance/stub_class_method_defined_on_class_test.rb index 3d8084e04..3b0c5c3cb 100644 --- a/test/acceptance/stub_class_method_defined_on_class_test.rb +++ b/test/acceptance/stub_class_method_defined_on_class_test.rb @@ -1,78 +1,13 @@ -require File.expand_path('../acceptance_test_helper', __FILE__) +require File.expand_path('../stub_instance_method_shared_tests', __FILE__) class StubClassMethodDefinedOnClassTest < Mocha::TestCase - include AcceptanceTest + include StubInstanceMethodSharedTests - def setup - setup_acceptance_test + def method_owner + stubbed_instance.singleton_class end - def teardown - teardown_acceptance_test + def stubbed_instance + @stubbed_instance ||= Class.new end - - # rubocop:disable Lint/DuplicateMethods - def test_should_stub_public_method_and_leave_it_unchanged_after_test - klass = Class.new do - class << self - def my_class_method - :original_return_value - end - public :my_class_method - def self.public(*args); end - end - end - assert_snapshot_unchanged(klass) do - test_result = run_as_test do - klass.stubs(:my_class_method).returns(:new_return_value) - assert_method_visibility klass, :my_class_method, :public - assert_equal :new_return_value, klass.my_class_method - end - assert_passed(test_result) - end - assert_equal :original_return_value, klass.my_class_method - end - - def test_should_stub_protected_method_and_leave_it_unchanged_after_test - klass = Class.new do - class << self - def my_class_method - :original_return_value - end - protected :my_class_method - def self.protected(*args); end - end - end - assert_snapshot_unchanged(klass) do - test_result = run_as_test do - klass.stubs(:my_class_method).returns(:new_return_value) - assert_method_visibility klass, :my_class_method, :protected - assert_equal :new_return_value, klass.send(:my_class_method) - end - assert_passed(test_result) - end - assert_equal :original_return_value, klass.send(:my_class_method) - end - - def test_should_stub_private_method_and_leave_it_unchanged_after_test - klass = Class.new do - class << self - def my_class_method - :original_return_value - end - private :my_class_method - def self.private(*args); end - end - end - assert_snapshot_unchanged(klass) do - test_result = run_as_test do - klass.stubs(:my_class_method).returns(:new_return_value) - assert_method_visibility klass, :my_class_method, :private - assert_equal :new_return_value, klass.send(:my_class_method) - end - assert_passed(test_result) - end - assert_equal :original_return_value, klass.send(:my_class_method) - end - # rubocop:enable Lint/DuplicateMethods end diff --git a/test/acceptance/stub_class_method_defined_on_module_test.rb b/test/acceptance/stub_class_method_defined_on_module_test.rb index 01ffba776..ffb2f9dca 100644 --- a/test/acceptance/stub_class_method_defined_on_module_test.rb +++ b/test/acceptance/stub_class_method_defined_on_module_test.rb @@ -1,73 +1,13 @@ -require File.expand_path('../acceptance_test_helper', __FILE__) +require File.expand_path('../stub_instance_method_shared_tests', __FILE__) class StubClassMethodDefinedOnModuleTest < Mocha::TestCase - include AcceptanceTest + include StubInstanceMethodSharedTests - def setup - setup_acceptance_test + def method_owner + @method_owner ||= Module.new end - def teardown - teardown_acceptance_test - end - - def test_should_stub_public_method_and_leave_it_unchanged_after_test - mod = Module.new do - def my_class_method - :original_return_value - end - public :my_class_method - end - klass = Class.new do - extend mod - end - assert_snapshot_unchanged(klass) do - test_result = run_as_test do - klass.stubs(:my_class_method).returns(:new_return_value) - assert_equal :new_return_value, klass.my_class_method - end - assert_passed(test_result) - end - assert_equal :original_return_value, klass.my_class_method - end - - def test_should_stub_protected_method_and_leave_it_unchanged_after_test - mod = Module.new do - def my_class_method - :original_return_value - end - protected :my_class_method - end - klass = Class.new do - extend mod - end - assert_snapshot_unchanged(klass) do - test_result = run_as_test do - klass.stubs(:my_class_method).returns(:new_return_value) - assert_equal :new_return_value, klass.send(:my_class_method) - end - assert_passed(test_result) - end - assert_equal :original_return_value, klass.send(:my_class_method) - end - - def test_should_stub_private_method_and_leave_it_unchanged_after_test - mod = Module.new do - def my_class_method - :original_return_value - end - private :my_class_method - end - klass = Class.new do - extend mod - end - assert_snapshot_unchanged(klass) do - test_result = run_as_test do - klass.stubs(:my_class_method).returns(:new_return_value) - assert_equal :new_return_value, klass.send(:my_class_method) - end - assert_passed(test_result) - end - assert_equal :original_return_value, klass.send(:my_class_method) + def stubbed_instance + Class.new.extend(method_owner) end end diff --git a/test/acceptance/stub_class_method_defined_on_superclass_test.rb b/test/acceptance/stub_class_method_defined_on_superclass_test.rb index 69b4ebaab..9765e7323 100644 --- a/test/acceptance/stub_class_method_defined_on_superclass_test.rb +++ b/test/acceptance/stub_class_method_defined_on_superclass_test.rb @@ -1,77 +1,17 @@ -require File.expand_path('../acceptance_test_helper', __FILE__) +require File.expand_path('../stub_instance_method_shared_tests', __FILE__) class StubClassMethodDefinedOnSuperclassTest < Mocha::TestCase - include AcceptanceTest + include StubInstanceMethodSharedTests - def setup - setup_acceptance_test + def method_owner + stubbed_instance.superclass.singleton_class end - def teardown - teardown_acceptance_test + def stubbed_instance + @stubbed_instance ||= Class.new(Class.new) end # rubocop:disable Lint/DuplicateMethods - def test_should_stub_public_method_on_child_class_and_leave_it_unchanged_after_test - superklass = Class.new do - class << self - def my_class_method - :original_return_value - end - public :my_class_method - end - end - klass = Class.new(superklass) - assert_snapshot_unchanged(klass) do - test_result = run_as_test do - klass.stubs(:my_class_method).returns(:new_return_value) - assert_equal :new_return_value, klass.my_class_method - end - assert_passed(test_result) - end - assert_equal :original_return_value, klass.my_class_method - end - - def test_should_stub_protected_method_on_child_class_and_leave_it_unchanged_after_test - superklass = Class.new do - class << self - def my_class_method - :original_return_value - end - protected :my_class_method - end - end - klass = Class.new(superklass) - assert_snapshot_unchanged(klass) do - test_result = run_as_test do - klass.stubs(:my_class_method).returns(:new_return_value) - assert_equal :new_return_value, klass.send(:my_class_method) - end - assert_passed(test_result) - end - assert_equal :original_return_value, klass.send(:my_class_method) - end - - def test_should_stub_private_method_on_child_class_and_leave_it_unchanged_after_test - superklass = Class.new do - class << self - def my_class_method - :original_return_value - end - private :my_class_method - end - end - klass = Class.new(superklass) - assert_snapshot_unchanged(klass) do - test_result = run_as_test do - klass.stubs(:my_class_method).returns(:new_return_value) - assert_equal :new_return_value, klass.send(:my_class_method) - end - assert_passed(test_result) - end - assert_equal :original_return_value, klass.send(:my_class_method) - end - def test_should_stub_method_on_superclass_and_leave_it_unchanged_after_test superklass = Class.new do class << self From 6d3b0475819083e529ad26b4d15569230ce924b5 Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Sun, 5 Jan 2020 20:18:37 +0000 Subject: [PATCH 24/33] allow stub_owner to be different from stubbed_instance This will allow us to, for instance, stub a method on a superclass but check the stubbed method on its child --- test/acceptance/stub_instance_method_shared_tests.rb | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/test/acceptance/stub_instance_method_shared_tests.rb b/test/acceptance/stub_instance_method_shared_tests.rb index 1b1fcdc9e..2bad2d4fc 100644 --- a/test/acceptance/stub_instance_method_shared_tests.rb +++ b/test/acceptance/stub_instance_method_shared_tests.rb @@ -30,10 +30,11 @@ def assert_snapshot_unchanged_on_stubbing(visibility) method_owner.send(visibility, :my_instance_method) method_owner.send(:alias_method, :my_aliased_method, :my_instance_method) if alias_method? instance = stubbed_instance + stub_owner_in_scope = stub_owner || instance method = alias_method? ? :my_aliased_method : :my_instance_method assert_snapshot_unchanged(instance) do test_result = run_as_test do - instance.stubs(method).returns(:new_return_value) + stub_owner_in_scope.stubs(method).returns(:new_return_value) assert_method_visibility instance, method, visibility assert_equal :new_return_value, instance.send(method) end @@ -45,4 +46,8 @@ def assert_snapshot_unchanged_on_stubbing(visibility) def alias_method? false end + + def stub_owner + nil + end end From 0ea322e2e6fbc9cf47f00341eb2daa482a9cba73 Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Sun, 5 Jan 2020 20:50:07 +0000 Subject: [PATCH 25/33] split superclass test into super & child --- ...class_method_defined_on_superclass_test.rb | 40 ++++++++----------- 1 file changed, 17 insertions(+), 23 deletions(-) diff --git a/test/acceptance/stub_class_method_defined_on_superclass_test.rb b/test/acceptance/stub_class_method_defined_on_superclass_test.rb index 9765e7323..d969169b2 100644 --- a/test/acceptance/stub_class_method_defined_on_superclass_test.rb +++ b/test/acceptance/stub_class_method_defined_on_superclass_test.rb @@ -1,7 +1,7 @@ require File.expand_path('../stub_instance_method_shared_tests', __FILE__) class StubClassMethodDefinedOnSuperclassTest < Mocha::TestCase - include StubInstanceMethodSharedTests + include StubMethodSharedTests def method_owner stubbed_instance.superclass.singleton_class @@ -11,27 +11,6 @@ def stubbed_instance @stubbed_instance ||= Class.new(Class.new) end - # rubocop:disable Lint/DuplicateMethods - def test_should_stub_method_on_superclass_and_leave_it_unchanged_after_test - superklass = Class.new do - class << self - def my_class_method - :original_return_value - end - public :my_class_method - end - end - klass = Class.new(superklass) - assert_snapshot_unchanged(klass) do - test_result = run_as_test do - superklass.stubs(:my_class_method).returns(:new_return_value) - assert_equal :new_return_value, klass.my_class_method - end - assert_passed(test_result) - end - assert_equal :original_return_value, klass.my_class_method - end - def test_stub_on_earliest_receiver_should_take_priority superklass = Class.new do class << self @@ -80,5 +59,20 @@ def self.my_class_method; end '- expected exactly once, invoked never: superklass.my_class_method(any_parameters)' ], test_result.failure_message_lines end - # rubocop:enable Lint/DuplicateMethods +end + +class StubSuperclassClassMethodDefinedOnSuperclassTest < Mocha::TestCase + include StubMethodSharedTests + + def method_owner + stubbed_instance.superclass.singleton_class + end + + def stubbed_instance + @stubbed_instance ||= Class.new(Class.new) + end + + def stub_owner + stubbed_instance.superclass + end end From 6a0bbc33d7f5fda5cdd60f66e51d015c62fc586b Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Sun, 5 Jan 2020 21:01:27 +0000 Subject: [PATCH 26/33] remove 'instance' qualifier from shared tests ... since it is now used for instance as well as class methods --- .../stub_class_method_defined_on_class_test.rb | 4 ++-- .../stub_class_method_defined_on_module_test.rb | 4 ++-- .../stub_class_method_defined_on_superclass_test.rb | 2 +- .../stub_instance_method_defined_on_class_test.rb | 4 ++-- ..._instance_method_defined_on_kernel_module_test.rb | 2 +- .../stub_instance_method_defined_on_module_test.rb | 4 ++-- ...b_instance_method_defined_on_object_class_test.rb | 4 ++-- ...nstance_method_defined_on_singleton_class_test.rb | 4 ++-- ...tub_instance_method_defined_on_superclass_test.rb | 4 ++-- ...stub_method_defined_on_module_and_aliased_test.rb | 4 ++-- ...d_shared_tests.rb => stub_method_shared_tests.rb} | 12 ++++++------ 11 files changed, 24 insertions(+), 24 deletions(-) rename test/acceptance/{stub_instance_method_shared_tests.rb => stub_method_shared_tests.rb} (76%) diff --git a/test/acceptance/stub_class_method_defined_on_class_test.rb b/test/acceptance/stub_class_method_defined_on_class_test.rb index 3b0c5c3cb..62add7acf 100644 --- a/test/acceptance/stub_class_method_defined_on_class_test.rb +++ b/test/acceptance/stub_class_method_defined_on_class_test.rb @@ -1,7 +1,7 @@ -require File.expand_path('../stub_instance_method_shared_tests', __FILE__) +require File.expand_path('../stub_method_shared_tests', __FILE__) class StubClassMethodDefinedOnClassTest < Mocha::TestCase - include StubInstanceMethodSharedTests + include StubMethodSharedTests def method_owner stubbed_instance.singleton_class diff --git a/test/acceptance/stub_class_method_defined_on_module_test.rb b/test/acceptance/stub_class_method_defined_on_module_test.rb index ffb2f9dca..ace8c6e81 100644 --- a/test/acceptance/stub_class_method_defined_on_module_test.rb +++ b/test/acceptance/stub_class_method_defined_on_module_test.rb @@ -1,7 +1,7 @@ -require File.expand_path('../stub_instance_method_shared_tests', __FILE__) +require File.expand_path('../stub_method_shared_tests', __FILE__) class StubClassMethodDefinedOnModuleTest < Mocha::TestCase - include StubInstanceMethodSharedTests + include StubMethodSharedTests def method_owner @method_owner ||= Module.new diff --git a/test/acceptance/stub_class_method_defined_on_superclass_test.rb b/test/acceptance/stub_class_method_defined_on_superclass_test.rb index d969169b2..dcd6a880d 100644 --- a/test/acceptance/stub_class_method_defined_on_superclass_test.rb +++ b/test/acceptance/stub_class_method_defined_on_superclass_test.rb @@ -1,4 +1,4 @@ -require File.expand_path('../stub_instance_method_shared_tests', __FILE__) +require File.expand_path('../stub_method_shared_tests', __FILE__) class StubClassMethodDefinedOnSuperclassTest < Mocha::TestCase include StubMethodSharedTests diff --git a/test/acceptance/stub_instance_method_defined_on_class_test.rb b/test/acceptance/stub_instance_method_defined_on_class_test.rb index 200c1c074..07b01e826 100644 --- a/test/acceptance/stub_instance_method_defined_on_class_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_class_test.rb @@ -1,7 +1,7 @@ -require File.expand_path('../stub_instance_method_shared_tests', __FILE__) +require File.expand_path('../stub_method_shared_tests', __FILE__) class StubInstanceMethodDefinedOnClassTest < Mocha::TestCase - include StubInstanceMethodSharedTests + include StubMethodSharedTests def method_owner @method_owner ||= Class.new diff --git a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb index 4bd6974c9..e5a1bb431 100644 --- a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb @@ -1,4 +1,4 @@ -require File.expand_path('../stub_instance_method_shared_tests', __FILE__) +require File.expand_path('../stub_method_shared_tests', __FILE__) class StubInstanceMethodDefinedOnKernelStubbedOnAnObjectTest < Mocha::TestCase def method_owner diff --git a/test/acceptance/stub_instance_method_defined_on_module_test.rb b/test/acceptance/stub_instance_method_defined_on_module_test.rb index 17bffee86..31f796e6c 100644 --- a/test/acceptance/stub_instance_method_defined_on_module_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_module_test.rb @@ -1,7 +1,7 @@ -require File.expand_path('../stub_instance_method_shared_tests', __FILE__) +require File.expand_path('../stub_method_shared_tests', __FILE__) class StubInstanceMethodDefinedOnModuleTest < Mocha::TestCase - include StubInstanceMethodSharedTests + include StubMethodSharedTests def method_owner @method_owner ||= Module.new diff --git a/test/acceptance/stub_instance_method_defined_on_object_class_test.rb b/test/acceptance/stub_instance_method_defined_on_object_class_test.rb index e52d04446..fdeea72d3 100644 --- a/test/acceptance/stub_instance_method_defined_on_object_class_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_object_class_test.rb @@ -1,7 +1,7 @@ -require File.expand_path('../stub_instance_method_shared_tests', __FILE__) +require File.expand_path('../stub_method_shared_tests', __FILE__) class StubInstanceMethodDefinedOnObjectClassTest < Mocha::TestCase - include StubInstanceMethodSharedTests + include StubMethodSharedTests def method_owner Object diff --git a/test/acceptance/stub_instance_method_defined_on_singleton_class_test.rb b/test/acceptance/stub_instance_method_defined_on_singleton_class_test.rb index 2e8cd4b60..fb57d8097 100644 --- a/test/acceptance/stub_instance_method_defined_on_singleton_class_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_singleton_class_test.rb @@ -1,7 +1,7 @@ -require File.expand_path('../stub_instance_method_shared_tests', __FILE__) +require File.expand_path('../stub_method_shared_tests', __FILE__) class StubInstanceMethodDefinedOnSingletonClassTest < Mocha::TestCase - include StubInstanceMethodSharedTests + include StubMethodSharedTests def method_owner stubbed_instance.singleton_class diff --git a/test/acceptance/stub_instance_method_defined_on_superclass_test.rb b/test/acceptance/stub_instance_method_defined_on_superclass_test.rb index 50003fe1b..e5c3f8fc9 100644 --- a/test/acceptance/stub_instance_method_defined_on_superclass_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_superclass_test.rb @@ -1,7 +1,7 @@ -require File.expand_path('../stub_instance_method_shared_tests', __FILE__) +require File.expand_path('../stub_method_shared_tests', __FILE__) class StubInstanceMethodDefinedOnSuperclassTest < Mocha::TestCase - include StubInstanceMethodSharedTests + include StubMethodSharedTests def method_owner @method_owner ||= Class.new diff --git a/test/acceptance/stub_method_defined_on_module_and_aliased_test.rb b/test/acceptance/stub_method_defined_on_module_and_aliased_test.rb index a8d58b51f..d389f9fd0 100644 --- a/test/acceptance/stub_method_defined_on_module_and_aliased_test.rb +++ b/test/acceptance/stub_method_defined_on_module_and_aliased_test.rb @@ -1,8 +1,8 @@ -require File.expand_path('../stub_instance_method_shared_tests', __FILE__) +require File.expand_path('../stub_method_shared_tests', __FILE__) unless Mocha::PRE_RUBY_V19 class StubMethodDefinedOnModuleAndAliasedTest < Mocha::TestCase - include StubInstanceMethodSharedTests + include StubMethodSharedTests def method_owner @method_owner ||= Module.new diff --git a/test/acceptance/stub_instance_method_shared_tests.rb b/test/acceptance/stub_method_shared_tests.rb similarity index 76% rename from test/acceptance/stub_instance_method_shared_tests.rb rename to test/acceptance/stub_method_shared_tests.rb index 2bad2d4fc..a1428ee4c 100644 --- a/test/acceptance/stub_instance_method_shared_tests.rb +++ b/test/acceptance/stub_method_shared_tests.rb @@ -1,16 +1,16 @@ require File.expand_path('../acceptance_test_helper', __FILE__) -module StubInstanceMethodSharedTests +module StubMethodSharedTests include AcceptanceTest def setup setup_acceptance_test - method_owner.send(:define_method, :my_instance_method) { :original_return_value } + method_owner.send(:define_method, :my_method) { :original_return_value } end def teardown method_owner.send(:remove_method, :my_aliased_method) if method_owner.method_defined?(:my_aliased_method) - method_owner.send(:remove_method, :my_instance_method) + method_owner.send(:remove_method, :my_method) teardown_acceptance_test end @@ -27,11 +27,11 @@ def test_should_stub_private_method_and_leave_it_unchanged_after_test end def assert_snapshot_unchanged_on_stubbing(visibility) - method_owner.send(visibility, :my_instance_method) - method_owner.send(:alias_method, :my_aliased_method, :my_instance_method) if alias_method? + method_owner.send(visibility, :my_method) + method_owner.send(:alias_method, :my_aliased_method, :my_method) if alias_method? instance = stubbed_instance stub_owner_in_scope = stub_owner || instance - method = alias_method? ? :my_aliased_method : :my_instance_method + method = alias_method? ? :my_aliased_method : :my_method assert_snapshot_unchanged(instance) do test_result = run_as_test do stub_owner_in_scope.stubs(method).returns(:new_return_value) From 060ebb7570704e8925e58b946e61ae6574a2cf6e Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Fri, 3 Jan 2020 23:53:24 +0000 Subject: [PATCH 27/33] reuse StubMethodSharedTests in StubModuleMethodTest ... and delete test_should_stub_method_within_test as covered by checks in StubMethodSharedTests --- test/acceptance/stub_module_method_test.rb | 76 ++-------------------- 1 file changed, 6 insertions(+), 70 deletions(-) diff --git a/test/acceptance/stub_module_method_test.rb b/test/acceptance/stub_module_method_test.rb index 3ba34712d..46fe9dee5 100644 --- a/test/acceptance/stub_module_method_test.rb +++ b/test/acceptance/stub_module_method_test.rb @@ -1,81 +1,17 @@ -require File.expand_path('../acceptance_test_helper', __FILE__) +require File.expand_path('../stub_method_shared_tests', __FILE__) class StubModuleMethodTest < Mocha::TestCase - include AcceptanceTest + include StubMethodSharedTests - def setup - setup_acceptance_test + def method_owner + stubbed_instance.singleton_class end - def teardown - teardown_acceptance_test + def stubbed_instance + @stubbed_instance ||= Module.new end # rubocop:disable Lint/DuplicateMethods - def test_should_stub_method_within_test - mod = Module.new do - def self.my_module_method - :original_return_value - end - end - test_result = run_as_test do - mod.stubs(:my_module_method).returns(:new_return_value) - assert_equal :new_return_value, mod.my_module_method - end - assert_passed(test_result) - end - - def test_should_leave_stubbed_public_method_unchanged_after_test - mod = Module.new do - class << self - def my_module_method - :original_return_value - end - public :my_module_method - end - end - run_as_test do - mod.stubs(:my_module_method).returns(:new_return_value) - end - assert(mod.public_methods(false).any? { |m| m.to_s == 'my_module_method' }) - assert_equal :original_return_value, mod.my_module_method - end - - def test_should_leave_stubbed_protected_method_unchanged_after_test - mod = Module.new do - class << self - def my_module_method - :original_return_value - end - protected :my_module_method - def my_unprotected_module_method - my_module_method - end - end - end - run_as_test do - mod.stubs(:my_module_method).returns(:new_return_value) - end - assert(mod.protected_methods(false).any? { |m| m.to_s == 'my_module_method' }) - assert_equal :original_return_value, mod.my_unprotected_module_method - end - - def test_should_leave_stubbed_private_method_unchanged_after_test - mod = Module.new do - class << self - def my_module_method - :original_return_value - end - private :my_module_method - end - end - run_as_test do - mod.stubs(:my_module_method).returns(:new_return_value) - end - assert(mod.private_methods(false).any? { |m| m.to_s == 'my_module_method' }) - assert_equal :original_return_value, mod.send(:my_module_method) - end - def test_should_reset_expectations_after_test mod = Module.new do def self.my_module_method From 1b5af22573354033c9469e3e705467fe4b7797da Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Sun, 5 Jan 2020 21:09:46 +0000 Subject: [PATCH 28/33] reuse StubMethodSharedTests in StubAnyInstanceMethodTest delete test_should_stub_*_method_within_test as already covered by checks in StubMethodSharedTests --- .../stub_any_instance_method_test.rb | 115 ++---------------- 1 file changed, 8 insertions(+), 107 deletions(-) diff --git a/test/acceptance/stub_any_instance_method_test.rb b/test/acceptance/stub_any_instance_method_test.rb index 20ad1aa50..73b280fba 100644 --- a/test/acceptance/stub_any_instance_method_test.rb +++ b/test/acceptance/stub_any_instance_method_test.rb @@ -1,45 +1,18 @@ -require File.expand_path('../acceptance_test_helper', __FILE__) +require File.expand_path('../stub_method_shared_tests', __FILE__) class StubAnyInstanceMethodTest < Mocha::TestCase - include AcceptanceTest + include StubMethodSharedTests - def setup - setup_acceptance_test + def method_owner + @method_owner ||= Class.new end - def teardown - teardown_acceptance_test + def stubbed_instance + method_owner.new end - def test_should_stub_public_method_within_test - klass = Class.new do - def my_instance_method - :original_return_value - end - end - instance = klass.new - test_result = run_as_test do - klass.any_instance.stubs(:my_instance_method).returns(:new_return_value) - assert_method_visibility instance, :my_instance_method, :public - assert_equal :new_return_value, instance.my_instance_method - end - assert_passed(test_result) - end - - def test_should_leave_stubbed_public_method_unchanged_after_test - klass = Class.new do - def my_instance_method - :original_return_value - end - public :my_instance_method - def self.public(*args); end - end - instance = klass.new - run_as_test do - klass.any_instance.stubs(:my_instance_method).returns(:new_return_value) - end - assert(instance.public_methods(false).any? { |m| m.to_s == 'my_instance_method' }) - assert_equal :original_return_value, instance.my_instance_method + def stub_owner + method_owner.any_instance end def test_should_leave_stubbed_public_method_unchanged_after_test_when_it_was_originally_private_in_owning_module @@ -62,78 +35,6 @@ def my_included_method assert_equal :original_return_value, instance.my_included_method end - def test_should_leave_stubbed_protected_method_unchanged_after_test - klass = Class.new do - def my_instance_method - :original_return_value - end - protected :my_instance_method - def self.protected(*args); end - - def my_unprotected_instance_method - my_instance_method - end - end - instance = klass.new - run_as_test do - klass.any_instance.stubs(:my_instance_method).returns(:new_return_value) - end - assert(instance.protected_methods(false).any? { |m| m.to_s == 'my_instance_method' }) - assert_equal :original_return_value, instance.my_unprotected_instance_method - end - - def test_should_stub_protected_method_within_test - klass = Class.new do - def my_instance_method - :original_return_value - end - protected :my_instance_method - def self.protected(*args); end - - def my_unprotected_instance_method - my_instance_method - end - end - instance = klass.new - test_result = run_as_test do - klass.any_instance.stubs(:my_instance_method).returns(:new_return_value) - assert_method_visibility instance, :my_instance_method, :protected - end - assert_passed(test_result) - end - - def test_should_leave_stubbed_private_method_unchanged_after_test - klass = Class.new do - def my_instance_method - :original_return_value - end - private :my_instance_method - def self.private(*args); end - end - instance = klass.new - run_as_test do - klass.any_instance.stubs(:my_instance_method).returns(:new_return_value) - end - assert(instance.private_methods(false).any? { |m| m.to_s == 'my_instance_method' }) - assert_equal :original_return_value, instance.send(:my_instance_method) - end - - def test_should_stub_private_method_within_test - klass = Class.new do - def my_instance_method - :original_return_value - end - private :my_instance_method - def self.private(*args); end - end - instance = klass.new - test_result = run_as_test do - klass.any_instance.stubs(:my_instance_method).returns(:new_return_value) - assert_method_visibility instance, :my_instance_method, :private - end - assert_passed(test_result) - end - def test_should_reset_expectations_after_test klass = Class.new do def my_instance_method From fdc2e2b702b88d6949964378d794a30c4202e173 Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Sun, 5 Jan 2020 22:05:01 +0000 Subject: [PATCH 29/33] use shared tests for method private in owning module --- .../stub_any_instance_method_test.rb | 43 ++++++++++--------- test/acceptance/stub_method_shared_tests.rb | 14 +++--- 2 files changed, 32 insertions(+), 25 deletions(-) diff --git a/test/acceptance/stub_any_instance_method_test.rb b/test/acceptance/stub_any_instance_method_test.rb index 73b280fba..d8cd5186d 100644 --- a/test/acceptance/stub_any_instance_method_test.rb +++ b/test/acceptance/stub_any_instance_method_test.rb @@ -15,26 +15,6 @@ def stub_owner method_owner.any_instance end - def test_should_leave_stubbed_public_method_unchanged_after_test_when_it_was_originally_private_in_owning_module - module_with_private_method = Module.new do - def my_included_method - :original_return_value - end - private :my_included_method - end - klass = Class.new do - include module_with_private_method - public :my_included_method - end - instance = klass.new - test_result = run_as_test do - klass.any_instance.stubs(:my_included_method).returns(:new_return_value) - assert_equal :new_return_value, instance.my_included_method - end - assert_passed(test_result) - assert_equal :original_return_value, instance.my_included_method - end - def test_should_reset_expectations_after_test klass = Class.new do def my_instance_method @@ -200,3 +180,26 @@ def private_instance_methods(_include_superclass = true) end # rubocop:enable Lint/DuplicateMethods end + +class StubAnyInstanceMethodOriginallyPrivateInOwningModuleTest < Mocha::TestCase + include StubMethodSharedTests + + def method_owner + @method_owner ||= Class.new.send(:include, module_with_private_method) + end + + def stubbed_instance + method_owner.new + end + + def stub_owner + method_owner.any_instance + end + + def module_with_private_method + mod = Module.new + mod.send(:define_method, stubbed_method_name) { :private_module_method_return_value } + mod.send(:private, stubbed_method_name) + mod + end +end diff --git a/test/acceptance/stub_method_shared_tests.rb b/test/acceptance/stub_method_shared_tests.rb index a1428ee4c..5883c80bd 100644 --- a/test/acceptance/stub_method_shared_tests.rb +++ b/test/acceptance/stub_method_shared_tests.rb @@ -5,12 +5,12 @@ module StubMethodSharedTests def setup setup_acceptance_test - method_owner.send(:define_method, :my_method) { :original_return_value } + method_owner.send(:define_method, stubbed_method_name) { :original_return_value } end def teardown method_owner.send(:remove_method, :my_aliased_method) if method_owner.method_defined?(:my_aliased_method) - method_owner.send(:remove_method, :my_method) + method_owner.send(:remove_method, stubbed_method_name) teardown_acceptance_test end @@ -27,11 +27,11 @@ def test_should_stub_private_method_and_leave_it_unchanged_after_test end def assert_snapshot_unchanged_on_stubbing(visibility) - method_owner.send(visibility, :my_method) - method_owner.send(:alias_method, :my_aliased_method, :my_method) if alias_method? + method_owner.send(visibility, stubbed_method_name) + method_owner.send(:alias_method, :my_aliased_method, stubbed_method_name) if alias_method? instance = stubbed_instance stub_owner_in_scope = stub_owner || instance - method = alias_method? ? :my_aliased_method : :my_method + method = alias_method? ? :my_aliased_method : stubbed_method_name assert_snapshot_unchanged(instance) do test_result = run_as_test do stub_owner_in_scope.stubs(method).returns(:new_return_value) @@ -50,4 +50,8 @@ def alias_method? def stub_owner nil end + + def stubbed_method_name + :my_method + end end From 620ff247462b76f4f82348142a2c818627939ab8 Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Mon, 6 Jan 2020 09:20:48 +0000 Subject: [PATCH 30/33] use shared tests for AnyInstance superclass checks ... while moving them from stub_any_instance_method_test to stub_any_instance_method_defined_on_superclass_test --- ...tance_method_defined_on_superclass_test.rb | 47 ++++++++------- .../stub_any_instance_method_test.rb | 60 ------------------- 2 files changed, 24 insertions(+), 83 deletions(-) diff --git a/test/acceptance/stub_any_instance_method_defined_on_superclass_test.rb b/test/acceptance/stub_any_instance_method_defined_on_superclass_test.rb index 85e41b35c..2417cd892 100644 --- a/test/acceptance/stub_any_instance_method_defined_on_superclass_test.rb +++ b/test/acceptance/stub_any_instance_method_defined_on_superclass_test.rb @@ -1,33 +1,18 @@ -require File.expand_path('../acceptance_test_helper', __FILE__) +require File.expand_path('../stub_method_shared_tests', __FILE__) class StubAnyInstanceMethodDefinedOnSuperclassTest < Mocha::TestCase - include AcceptanceTest + include StubMethodSharedTests - def setup - setup_acceptance_test + def method_owner + stubbed_instance.class.superclass end - def teardown - teardown_acceptance_test + def stubbed_instance + @stubbed_instance ||= Class.new(Class.new).new end - def test_should_stub_method_and_leave_it_unchanged_after_test - superklass = Class.new do - def my_superclass_method - :original_return_value - end - public :my_superclass_method - end - klass = Class.new(superklass) - instance = klass.new - assert_snapshot_unchanged(instance) do - test_result = run_as_test do - superklass.any_instance.stubs(:my_superclass_method).returns(:new_return_value) - assert_equal :new_return_value, instance.my_superclass_method - end - assert_passed(test_result) - end - assert_equal :original_return_value, instance.my_superclass_method + def stub_owner + stubbed_instance.class.any_instance end def test_expect_method_on_any_instance_of_superclass_even_if_preceded_by_test_expecting_method_on_any_instance_of_subclass @@ -62,3 +47,19 @@ def my_instance_method; end ], test_result.failure_message_lines end end + +class StubSuperclassAnyInstanceMethodDefinedOnSuperclassTest < Mocha::TestCase + include StubMethodSharedTests + + def method_owner + stubbed_instance.class.superclass + end + + def stubbed_instance + @stubbed_instance ||= Class.new(Class.new).new + end + + def stub_owner + method_owner.any_instance + end +end diff --git a/test/acceptance/stub_any_instance_method_test.rb b/test/acceptance/stub_any_instance_method_test.rb index d8cd5186d..4faddbe33 100644 --- a/test/acceptance/stub_any_instance_method_test.rb +++ b/test/acceptance/stub_any_instance_method_test.rb @@ -28,66 +28,6 @@ def my_instance_method assert_equal 0, klass.any_instance.mocha.__expectations__.length end - def test_should_be_able_to_stub_a_public_superclass_method - superklass = Class.new do - def my_superclass_method - :original_return_value - end - public :my_superclass_method - end - klass = Class.new(superklass) - instance = klass.new - test_result = run_as_test do - klass.any_instance.stubs(:my_superclass_method).returns(:new_return_value) - assert_method_visibility instance, :my_superclass_method, :public - assert_equal :new_return_value, instance.my_superclass_method - end - assert_passed(test_result) - assert(instance.public_methods(true).any? { |m| m.to_s == 'my_superclass_method' }) - assert(klass.public_methods(false).none? { |m| m.to_s == 'my_superclass_method' }) - assert_equal :original_return_value, instance.my_superclass_method - end - - def test_should_be_able_to_stub_a_protected_superclass_method - superklass = Class.new do - def my_superclass_method - :original_return_value - end - protected :my_superclass_method - end - klass = Class.new(superklass) - instance = klass.new - test_result = run_as_test do - klass.any_instance.stubs(:my_superclass_method).returns(:new_return_value) - assert_method_visibility instance, :my_superclass_method, :protected - assert_equal :new_return_value, instance.send(:my_superclass_method) - end - assert_passed(test_result) - assert(instance.protected_methods(true).any? { |m| m.to_s == 'my_superclass_method' }) - assert(klass.protected_methods(false).none? { |m| m.to_s == 'my_superclass_method' }) - assert_equal :original_return_value, instance.send(:my_superclass_method) - end - - def test_should_be_able_to_stub_a_private_superclass_method - superklass = Class.new do - def my_superclass_method - :original_return_value - end - private :my_superclass_method - end - klass = Class.new(superklass) - instance = klass.new - test_result = run_as_test do - klass.any_instance.stubs(:my_superclass_method).returns(:new_return_value) - assert_method_visibility instance, :my_superclass_method, :private - assert_equal :new_return_value, instance.send(:my_superclass_method) - end - assert_passed(test_result) - assert(instance.private_methods(true).any? { |m| m.to_s == 'my_superclass_method' }) - assert(klass.private_methods(false).none? { |m| m.to_s == 'my_superclass_method' }) - assert_equal :original_return_value, instance.send(:my_superclass_method) - end - # rubocop:disable Lint/DuplicateMethods def test_should_be_able_to_stub_method_if_ruby18_public_instance_methods_include_method_but_method_does_not_actually_exist_like_active_record_association_proxy ruby18_klass = Class.new do From 99ca183a27c6c499e80579a3c0644cea330649f3 Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Mon, 6 Jan 2020 12:13:04 +0000 Subject: [PATCH 31/33] delete test_should_be_able_to_stub_a_superclass_method It wasn't checking stubbing of a supeclass or even a supermodule method. self.my_superclass_method from supermod isn't inherited/included in mod. So, all that it checked was that you could stub a non-existent module method. --- test/acceptance/stub_module_method_test.rb | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/test/acceptance/stub_module_method_test.rb b/test/acceptance/stub_module_method_test.rb index 46fe9dee5..08d7e8194 100644 --- a/test/acceptance/stub_module_method_test.rb +++ b/test/acceptance/stub_module_method_test.rb @@ -24,25 +24,6 @@ def self.my_module_method assert_equal 0, mod.mocha.__expectations__.length end - def test_should_be_able_to_stub_a_superclass_method - supermod = Module.new do - def self.my_superclass_method - :original_return_value - end - end - mod = Module.new do - include supermod - end - test_result = run_as_test do - mod.stubs(:my_superclass_method).returns(:new_return_value) - assert_equal :new_return_value, mod.my_superclass_method - end - assert_passed(test_result) - assert(supermod.public_methods.any? { |m| m.to_s == 'my_superclass_method' }) - assert(mod.public_methods(false).none? { |m| m.to_s == 'my_superclass_method' }) - assert_equal :original_return_value, supermod.my_superclass_method - end - def test_should_be_able_to_stub_method_if_ruby18_public_methods_include_method_but_method_does_not_actually_exist_like_active_record_association_proxy ruby18_mod = Module.new do class << self From aad1b3f8d09096daf7d717fa494d6b10d842b702 Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Mon, 6 Jan 2020 15:05:38 +0000 Subject: [PATCH 32/33] extract assert_passed_with_snapshot_unchanged ... to DRY up assert_snapshot_unchanged + run_as_test + assert_passed combo --- test/acceptance/acceptance_test_helper.rb | 4 +++ test/acceptance/prepend_test.rb | 29 +++++++-------------- test/acceptance/stub_method_shared_tests.rb | 11 +++----- 3 files changed, 18 insertions(+), 26 deletions(-) diff --git a/test/acceptance/acceptance_test_helper.rb b/test/acceptance/acceptance_test_helper.rb index 6bdc99d80..f7456d51a 100644 --- a/test/acceptance/acceptance_test_helper.rb +++ b/test/acceptance/acceptance_test_helper.rb @@ -38,5 +38,9 @@ def teardown_acceptance_test Mocha::Configuration.reset_configuration end + def assert_passed_with_snapshot_unchanged(object, &block) + assert_snapshot_unchanged(object) { assert_passed(run_as_test(&block)) } + end + include Introspection::Assertions end diff --git a/test/acceptance/prepend_test.rb b/test/acceptance/prepend_test.rb index 5a9dcc278..639a9d41a 100644 --- a/test/acceptance/prepend_test.rb +++ b/test/acceptance/prepend_test.rb @@ -47,12 +47,9 @@ def my_method end def test_stubbing_any_instance_with_multiple_prepended_methods - assert_snapshot_unchanged(Klass1) do - test_result = run_as_test do - Klass1.any_instance.stubs(:my_method).returns('Bye World') - assert_equal 'Bye World', Klass1.new.my_method - end - assert_passed(test_result) + assert_passed_with_snapshot_unchanged(Klass1) do + Klass1.any_instance.stubs(:my_method).returns('Bye World') + assert_equal 'Bye World', Klass1.new.my_method end assert_equal 'Hello World Wide', Klass1.new.my_method end @@ -60,24 +57,18 @@ def test_stubbing_any_instance_with_multiple_prepended_methods def test_stubbing_instance_with_multiple_prepended_methods object = Klass1.new - assert_snapshot_unchanged(object) do - test_result = run_as_test do - object.stubs(:my_method).returns('Bye World') - assert_equal 'Bye World', object.my_method - assert_equal 'Hello World Wide', Klass1.new.my_method - end - assert_passed(test_result) + assert_passed_with_snapshot_unchanged(object) do + object.stubs(:my_method).returns('Bye World') + assert_equal 'Bye World', object.my_method + assert_equal 'Hello World Wide', Klass1.new.my_method end assert_equal 'Hello World Wide', object.my_method end def test_stubbing_a_prepended_class_method - assert_snapshot_unchanged(Klass2) do - test_result = run_as_test do - Klass2.stubs(:my_method).returns('Bye World') - assert_equal 'Bye World', Klass2.my_method - end - assert_passed(test_result) + assert_passed_with_snapshot_unchanged(Klass2) do + Klass2.stubs(:my_method).returns('Bye World') + assert_equal 'Bye World', Klass2.my_method end assert_equal 'Hello World Wide', Klass2.my_method end diff --git a/test/acceptance/stub_method_shared_tests.rb b/test/acceptance/stub_method_shared_tests.rb index 5883c80bd..24d0da3ab 100644 --- a/test/acceptance/stub_method_shared_tests.rb +++ b/test/acceptance/stub_method_shared_tests.rb @@ -32,13 +32,10 @@ def assert_snapshot_unchanged_on_stubbing(visibility) instance = stubbed_instance stub_owner_in_scope = stub_owner || instance method = alias_method? ? :my_aliased_method : stubbed_method_name - assert_snapshot_unchanged(instance) do - test_result = run_as_test do - stub_owner_in_scope.stubs(method).returns(:new_return_value) - assert_method_visibility instance, method, visibility - assert_equal :new_return_value, instance.send(method) - end - assert_passed(test_result) + assert_passed_with_snapshot_unchanged(instance) do + stub_owner_in_scope.stubs(method).returns(:new_return_value) + assert_method_visibility instance, method, visibility + assert_equal :new_return_value, instance.send(method) end assert_equal :original_return_value, instance.send(method) end From 18c8c493876330e4573a662611103b8f4a0fc924 Mon Sep 17 00:00:00 2001 From: Nitish Rathi Date: Fri, 17 Jan 2020 02:44:25 +0000 Subject: [PATCH 33/33] stubbed_instance -> callee, stub_owner -> stubbee --- ...stance_method_defined_on_superclass_test.rb | 18 +++++++++--------- .../stub_any_instance_method_test.rb | 8 ++++---- .../stub_class_method_defined_on_class_test.rb | 6 +++--- ...stub_class_method_defined_on_module_test.rb | 2 +- ..._class_method_defined_on_superclass_test.rb | 16 ++++++++-------- ...ub_instance_method_defined_on_class_test.rb | 2 +- ...nce_method_defined_on_kernel_module_test.rb | 4 ++-- ...b_instance_method_defined_on_module_test.rb | 2 +- ...ance_method_defined_on_object_class_test.rb | 2 +- ...e_method_defined_on_singleton_class_test.rb | 6 +++--- ...stance_method_defined_on_superclass_test.rb | 2 +- ...ethod_defined_on_module_and_aliased_test.rb | 2 +- test/acceptance/stub_method_shared_tests.rb | 16 ++++++++-------- test/acceptance/stub_module_method_test.rb | 6 +++--- 14 files changed, 46 insertions(+), 46 deletions(-) diff --git a/test/acceptance/stub_any_instance_method_defined_on_superclass_test.rb b/test/acceptance/stub_any_instance_method_defined_on_superclass_test.rb index 2417cd892..5102b26c0 100644 --- a/test/acceptance/stub_any_instance_method_defined_on_superclass_test.rb +++ b/test/acceptance/stub_any_instance_method_defined_on_superclass_test.rb @@ -4,15 +4,15 @@ class StubAnyInstanceMethodDefinedOnSuperclassTest < Mocha::TestCase include StubMethodSharedTests def method_owner - stubbed_instance.class.superclass + callee.class.superclass end - def stubbed_instance - @stubbed_instance ||= Class.new(Class.new).new + def callee + @callee ||= Class.new(Class.new).new end - def stub_owner - stubbed_instance.class.any_instance + def stubbee + callee.class.any_instance end def test_expect_method_on_any_instance_of_superclass_even_if_preceded_by_test_expecting_method_on_any_instance_of_subclass @@ -52,14 +52,14 @@ class StubSuperclassAnyInstanceMethodDefinedOnSuperclassTest < Mocha::TestCase include StubMethodSharedTests def method_owner - stubbed_instance.class.superclass + callee.class.superclass end - def stubbed_instance - @stubbed_instance ||= Class.new(Class.new).new + def callee + @callee ||= Class.new(Class.new).new end - def stub_owner + def stubbee method_owner.any_instance end end diff --git a/test/acceptance/stub_any_instance_method_test.rb b/test/acceptance/stub_any_instance_method_test.rb index 4faddbe33..59bb4cc45 100644 --- a/test/acceptance/stub_any_instance_method_test.rb +++ b/test/acceptance/stub_any_instance_method_test.rb @@ -7,11 +7,11 @@ def method_owner @method_owner ||= Class.new end - def stubbed_instance + def callee method_owner.new end - def stub_owner + def stubbee method_owner.any_instance end @@ -128,11 +128,11 @@ def method_owner @method_owner ||= Class.new.send(:include, module_with_private_method) end - def stubbed_instance + def callee method_owner.new end - def stub_owner + def stubbee method_owner.any_instance end diff --git a/test/acceptance/stub_class_method_defined_on_class_test.rb b/test/acceptance/stub_class_method_defined_on_class_test.rb index 62add7acf..2481b9734 100644 --- a/test/acceptance/stub_class_method_defined_on_class_test.rb +++ b/test/acceptance/stub_class_method_defined_on_class_test.rb @@ -4,10 +4,10 @@ class StubClassMethodDefinedOnClassTest < Mocha::TestCase include StubMethodSharedTests def method_owner - stubbed_instance.singleton_class + callee.singleton_class end - def stubbed_instance - @stubbed_instance ||= Class.new + def callee + @callee ||= Class.new end end diff --git a/test/acceptance/stub_class_method_defined_on_module_test.rb b/test/acceptance/stub_class_method_defined_on_module_test.rb index ace8c6e81..b9acec82c 100644 --- a/test/acceptance/stub_class_method_defined_on_module_test.rb +++ b/test/acceptance/stub_class_method_defined_on_module_test.rb @@ -7,7 +7,7 @@ def method_owner @method_owner ||= Module.new end - def stubbed_instance + def callee Class.new.extend(method_owner) end end diff --git a/test/acceptance/stub_class_method_defined_on_superclass_test.rb b/test/acceptance/stub_class_method_defined_on_superclass_test.rb index dcd6a880d..3f5c6b9ed 100644 --- a/test/acceptance/stub_class_method_defined_on_superclass_test.rb +++ b/test/acceptance/stub_class_method_defined_on_superclass_test.rb @@ -4,11 +4,11 @@ class StubClassMethodDefinedOnSuperclassTest < Mocha::TestCase include StubMethodSharedTests def method_owner - stubbed_instance.superclass.singleton_class + callee.superclass.singleton_class end - def stubbed_instance - @stubbed_instance ||= Class.new(Class.new) + def callee + @callee ||= Class.new(Class.new) end def test_stub_on_earliest_receiver_should_take_priority @@ -65,14 +65,14 @@ class StubSuperclassClassMethodDefinedOnSuperclassTest < Mocha::TestCase include StubMethodSharedTests def method_owner - stubbed_instance.superclass.singleton_class + callee.superclass.singleton_class end - def stubbed_instance - @stubbed_instance ||= Class.new(Class.new) + def callee + @callee ||= Class.new(Class.new) end - def stub_owner - stubbed_instance.superclass + def stubbee + callee.superclass end end diff --git a/test/acceptance/stub_instance_method_defined_on_class_test.rb b/test/acceptance/stub_instance_method_defined_on_class_test.rb index 07b01e826..2a10a1166 100644 --- a/test/acceptance/stub_instance_method_defined_on_class_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_class_test.rb @@ -7,7 +7,7 @@ def method_owner @method_owner ||= Class.new end - def stubbed_instance + def callee method_owner.new end end diff --git a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb index e5a1bb431..00fb5cad1 100644 --- a/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb @@ -5,7 +5,7 @@ def method_owner Kernel end - def stubbed_instance + def callee Class.new.new end end @@ -15,7 +15,7 @@ def method_owner Kernel end - def stubbed_instance + def callee Module.new end end diff --git a/test/acceptance/stub_instance_method_defined_on_module_test.rb b/test/acceptance/stub_instance_method_defined_on_module_test.rb index 31f796e6c..a793ae147 100644 --- a/test/acceptance/stub_instance_method_defined_on_module_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_module_test.rb @@ -7,7 +7,7 @@ def method_owner @method_owner ||= Module.new end - def stubbed_instance + def callee Class.new.send(:include, method_owner).new end end diff --git a/test/acceptance/stub_instance_method_defined_on_object_class_test.rb b/test/acceptance/stub_instance_method_defined_on_object_class_test.rb index fdeea72d3..692838e9e 100644 --- a/test/acceptance/stub_instance_method_defined_on_object_class_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_object_class_test.rb @@ -7,7 +7,7 @@ def method_owner Object end - def stubbed_instance + def callee Class.new.new end end diff --git a/test/acceptance/stub_instance_method_defined_on_singleton_class_test.rb b/test/acceptance/stub_instance_method_defined_on_singleton_class_test.rb index fb57d8097..2c020ff29 100644 --- a/test/acceptance/stub_instance_method_defined_on_singleton_class_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_singleton_class_test.rb @@ -4,10 +4,10 @@ class StubInstanceMethodDefinedOnSingletonClassTest < Mocha::TestCase include StubMethodSharedTests def method_owner - stubbed_instance.singleton_class + callee.singleton_class end - def stubbed_instance - @stubbed_instance ||= Class.new.new + def callee + @callee ||= Class.new.new end end diff --git a/test/acceptance/stub_instance_method_defined_on_superclass_test.rb b/test/acceptance/stub_instance_method_defined_on_superclass_test.rb index e5c3f8fc9..16bf36928 100644 --- a/test/acceptance/stub_instance_method_defined_on_superclass_test.rb +++ b/test/acceptance/stub_instance_method_defined_on_superclass_test.rb @@ -7,7 +7,7 @@ def method_owner @method_owner ||= Class.new end - def stubbed_instance + def callee Class.new(method_owner).new end end diff --git a/test/acceptance/stub_method_defined_on_module_and_aliased_test.rb b/test/acceptance/stub_method_defined_on_module_and_aliased_test.rb index d389f9fd0..90c2bd5b9 100644 --- a/test/acceptance/stub_method_defined_on_module_and_aliased_test.rb +++ b/test/acceptance/stub_method_defined_on_module_and_aliased_test.rb @@ -8,7 +8,7 @@ def method_owner @method_owner ||= Module.new end - def stubbed_instance + def callee Class.new.extend(method_owner) end diff --git a/test/acceptance/stub_method_shared_tests.rb b/test/acceptance/stub_method_shared_tests.rb index 24d0da3ab..f1cd6ec1e 100644 --- a/test/acceptance/stub_method_shared_tests.rb +++ b/test/acceptance/stub_method_shared_tests.rb @@ -29,22 +29,22 @@ def test_should_stub_private_method_and_leave_it_unchanged_after_test def assert_snapshot_unchanged_on_stubbing(visibility) method_owner.send(visibility, stubbed_method_name) method_owner.send(:alias_method, :my_aliased_method, stubbed_method_name) if alias_method? - instance = stubbed_instance - stub_owner_in_scope = stub_owner || instance + callee_in_scope = callee + stubbee_in_scope = stubbee || callee_in_scope method = alias_method? ? :my_aliased_method : stubbed_method_name - assert_passed_with_snapshot_unchanged(instance) do - stub_owner_in_scope.stubs(method).returns(:new_return_value) - assert_method_visibility instance, method, visibility - assert_equal :new_return_value, instance.send(method) + assert_passed_with_snapshot_unchanged(callee_in_scope) do + stubbee_in_scope.stubs(method).returns(:new_return_value) + assert_method_visibility callee_in_scope, method, visibility + assert_equal :new_return_value, callee_in_scope.send(method) end - assert_equal :original_return_value, instance.send(method) + assert_equal :original_return_value, callee_in_scope.send(method) end def alias_method? false end - def stub_owner + def stubbee nil end diff --git a/test/acceptance/stub_module_method_test.rb b/test/acceptance/stub_module_method_test.rb index 08d7e8194..1a07ccb7c 100644 --- a/test/acceptance/stub_module_method_test.rb +++ b/test/acceptance/stub_module_method_test.rb @@ -4,11 +4,11 @@ class StubModuleMethodTest < Mocha::TestCase include StubMethodSharedTests def method_owner - stubbed_instance.singleton_class + callee.singleton_class end - def stubbed_instance - @stubbed_instance ||= Module.new + def callee + @callee ||= Module.new end # rubocop:disable Lint/DuplicateMethods