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_any_instance_method_defined_on_superclass_test.rb b/test/acceptance/stub_any_instance_method_defined_on_superclass_test.rb index 85e41b35c..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 @@ -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 + callee.class.superclass end - def teardown - teardown_acceptance_test + def callee + @callee ||= 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 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 @@ -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 + callee.class.superclass + end + + def callee + @callee ||= Class.new(Class.new).new + end + + 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 20ad1aa50..59bb4cc45 100644 --- a/test/acceptance/stub_any_instance_method_test.rb +++ b/test/acceptance/stub_any_instance_method_test.rb @@ -1,137 +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 callee + 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 - 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_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) + def stubbee + method_owner.any_instance end def test_should_reset_expectations_after_test @@ -147,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 @@ -299,3 +120,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 callee + method_owner.new + end + + def stubbee + 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_class_method_defined_on_class_test.rb b/test/acceptance/stub_class_method_defined_on_class_test.rb index 3d8084e04..2481b9734 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_method_shared_tests', __FILE__) class StubClassMethodDefinedOnClassTest < Mocha::TestCase - include AcceptanceTest + include StubMethodSharedTests - def setup - setup_acceptance_test + def method_owner + callee.singleton_class end - def teardown - teardown_acceptance_test + def callee + @callee ||= 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..b9acec82c 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_method_shared_tests', __FILE__) class StubClassMethodDefinedOnModuleTest < Mocha::TestCase - include AcceptanceTest + include StubMethodSharedTests - 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 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 69b4ebaab..3f5c6b9ed 100644 --- a/test/acceptance/stub_class_method_defined_on_superclass_test.rb +++ b/test/acceptance/stub_class_method_defined_on_superclass_test.rb @@ -1,95 +1,14 @@ -require File.expand_path('../acceptance_test_helper', __FILE__) +require File.expand_path('../stub_method_shared_tests', __FILE__) class StubClassMethodDefinedOnSuperclassTest < Mocha::TestCase - include AcceptanceTest + include StubMethodSharedTests - def setup - setup_acceptance_test + def method_owner + callee.superclass.singleton_class end - def teardown - teardown_acceptance_test - 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 - 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 + def callee + @callee ||= Class.new(Class.new) end def test_stub_on_earliest_receiver_should_take_priority @@ -140,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 + callee.superclass.singleton_class + end + + def callee + @callee ||= Class.new(Class.new) + end + + def stubbee + callee.superclass + end end 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 2da879736..2a10a1166 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,19 @@ -require File.expand_path('../acceptance_test_helper', __FILE__) +require File.expand_path('../stub_method_shared_tests', __FILE__) class StubInstanceMethodDefinedOnClassTest < Mocha::TestCase - include AcceptanceTest + include StubMethodSharedTests - def setup - setup_acceptance_test + def method_owner + @method_owner ||= 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) + def callee + method_owner.new end +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) +class StubInstanceMethodDefinedOnClassAndAliasedTest < StubInstanceMethodDefinedOnClassTest + def alias_method? + true 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 b51fea761..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 @@ -1,136 +1,21 @@ -require File.expand_path('../acceptance_test_helper', __FILE__) +require File.expand_path('../stub_method_shared_tests', __FILE__) -class StubInstanceMethodDefinedOnKernelModuleTest < 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 - Kernel.module_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 - Kernel.module_eval { remove_method :my_instance_method } +class StubInstanceMethodDefinedOnKernelStubbedOnAnObjectTest < Mocha::TestCase + def method_owner + Kernel 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 - 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 - 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 - 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 - 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 - 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 - end - assert_passed(test_result) - end - assert_equal :original_return_value, mod.my_instance_method - ensure - Kernel.module_eval { remove_method :my_instance_method } + def callee + Class.new.new end +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 - 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) - ensure - Kernel.module_eval { remove_method :my_instance_method } +class StubInstanceMethodDefinedOnKernelStubbedOnAModuleTest < Mocha::TestCase + def method_owner + Kernel 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 - 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_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) - ensure - Kernel.module_eval { remove_method :my_instance_method } + 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 74df84447..a793ae147 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_method_shared_tests', __FILE__) class StubInstanceMethodDefinedOnModuleTest < Mocha::TestCase - include AcceptanceTest + include StubMethodSharedTests - 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_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 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 ad25df2b3..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 @@ -1,75 +1,13 @@ -require File.expand_path('../acceptance_test_helper', __FILE__) +require File.expand_path('../stub_method_shared_tests', __FILE__) class StubInstanceMethodDefinedOnObjectClassTest < Mocha::TestCase - include AcceptanceTest + include StubMethodSharedTests - def setup - setup_acceptance_test + def method_owner + Object end - def teardown - teardown_acceptance_test + def callee + Class.new.new 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_defined_on_singleton_class_test.rb b/test/acceptance/stub_instance_method_defined_on_singleton_class_test.rb index c08373f34..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 @@ -1,67 +1,13 @@ -require File.expand_path('../acceptance_test_helper', __FILE__) +require File.expand_path('../stub_method_shared_tests', __FILE__) class StubInstanceMethodDefinedOnSingletonClassTest < Mocha::TestCase - include AcceptanceTest + include StubMethodSharedTests - def setup - setup_acceptance_test + def method_owner + callee.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 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 38ec5d077..16bf36928 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_method_shared_tests', __FILE__) class StubInstanceMethodDefinedOnSuperclassTest < Mocha::TestCase - include AcceptanceTest + include StubMethodSharedTests - def setup - setup_acceptance_test + def method_owner + @method_owner ||= 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 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 e7f607502..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 @@ -1,38 +1,19 @@ -require File.expand_path('../acceptance_test_helper', __FILE__) +require File.expand_path('../stub_method_shared_tests', __FILE__) unless Mocha::PRE_RUBY_V19 class StubMethodDefinedOnModuleAndAliasedTest < Mocha::TestCase - include AcceptanceTest + include StubMethodSharedTests - def setup - setup_acceptance_test + def method_owner + @method_owner ||= Module.new end - def teardown - teardown_acceptance_test + def callee + 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 diff --git a/test/acceptance/stub_method_shared_tests.rb b/test/acceptance/stub_method_shared_tests.rb new file mode 100644 index 000000000..f1cd6ec1e --- /dev/null +++ b/test/acceptance/stub_method_shared_tests.rb @@ -0,0 +1,54 @@ +require File.expand_path('../acceptance_test_helper', __FILE__) + +module StubMethodSharedTests + include AcceptanceTest + + def setup + setup_acceptance_test + 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, stubbed_method_name) + teardown_acceptance_test + end + + def test_should_stub_public_method_and_leave_it_unchanged_after_test + 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) + end + + 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) + method_owner.send(visibility, stubbed_method_name) + method_owner.send(:alias_method, :my_aliased_method, stubbed_method_name) if alias_method? + 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(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, callee_in_scope.send(method) + end + + def alias_method? + false + end + + def stubbee + nil + end + + def stubbed_method_name + :my_method + end +end diff --git a/test/acceptance/stub_module_method_test.rb b/test/acceptance/stub_module_method_test.rb index 3ba34712d..1a07ccb7c 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 + callee.singleton_class end - def teardown - teardown_acceptance_test + def callee + @callee ||= 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 @@ -88,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