Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Stub method shared tests #458

Open
wants to merge 33 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
c203058
move define/remove method to setup/teardown
nitishr Jan 3, 2020
36888e8
replace module_eval with send
nitishr Jan 3, 2020
c455732
prep to DRY by using send instead of direct invocation
nitishr Jan 3, 2020
d2362c5
DRY up public, protected and private checks
nitishr Jan 3, 2020
26de50e
Prep to DRY - use send & extract visibility to a var
nitishr Jan 3, 2020
6fe3702
DRY up Module public, protected and private checks
nitishr Jan 3, 2020
fec664a
prep to DRY by making assert methods near identical
nitishr Jan 3, 2020
9c47db1
DRY up assert_snapshot_unchanged_on_stubbing*
nitishr Jan 3, 2020
90570ec
inline delegating methods
nitishr Jan 3, 2020
32562f1
rename assert_snapshot_unchanged_on_stubbing_method
nitishr Jan 3, 2020
2e425af
extract & reuse StubInstanceMethodSharedTests
nitishr Jan 3, 2020
0d024d4
allow instantiation to be parameterized by subclassing
nitishr Jan 3, 2020
44037fe
reuse StubInstanceMethodSharedTests in StubInstanceMethodDefinedOnCla…
nitishr Jan 3, 2020
388c608
reuse StubInstanceMethodSharedTests in StubInstanceMethodDefinedOnMod…
nitishr Jan 3, 2020
b8505d1
reuse StubInstanceMethodSharedTests in StubInstanceMethodDefinedOnSup…
nitishr Jan 3, 2020
60036df
more expressive name: stubbed_module -> method_owner
nitishr Jan 3, 2020
e9cfc66
split StubInstanceMethodDefinedOnKernelModuleTest into two
nitishr Jan 3, 2020
eef3880
return stubbed instance instead of stubbed class
nitishr Jan 3, 2020
a84b186
reuse StubInstanceMethodSharedTests in StubInstanceMethodDefinedOnSin…
nitishr Jan 3, 2020
adc1d2f
check aliased method stubbing if stub_aliased_method
nitishr Jan 3, 2020
bffb23d
reuse StubInstanceMethodSharedTests in StubInstanceMethodDefinedOnCla…
nitishr Jan 3, 2020
1180f77
reuse StubInstanceMethodSharedTests in StubMethodDefinedOnModuleAndAl…
nitishr Jan 3, 2020
ba0617b
reuse StubInstanceMethodSharedTests in StubClassMethod*Test
nitishr Jan 5, 2020
6d3b047
allow stub_owner to be different from stubbed_instance
nitishr Jan 5, 2020
0ea322e
split superclass test into super & child
nitishr Jan 5, 2020
6a0bbc3
remove 'instance' qualifier from shared tests
nitishr Jan 5, 2020
060ebb7
reuse StubMethodSharedTests in StubModuleMethodTest
nitishr Jan 3, 2020
1b5af22
reuse StubMethodSharedTests in StubAnyInstanceMethodTest
nitishr Jan 5, 2020
fdc2e2b
use shared tests for method private in owning module
nitishr Jan 5, 2020
620ff24
use shared tests for AnyInstance superclass checks
nitishr Jan 6, 2020
99ca183
delete test_should_be_able_to_stub_a_superclass_method
nitishr Jan 6, 2020
aad1b3f
extract assert_passed_with_snapshot_unchanged
nitishr Jan 6, 2020
18c8c49
stubbed_instance -> callee, stub_owner -> stubbee
nitishr Jan 17, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 4 additions & 0 deletions test/acceptance/acceptance_test_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
29 changes: 10 additions & 19 deletions test/acceptance/prepend_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -47,37 +47,28 @@ 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

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
Expand Down
Original file line number Diff line number Diff line change
@@ -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
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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
Expand Down Expand Up @@ -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
218 changes: 31 additions & 187 deletions test/acceptance/stub_any_instance_method_test.rb
Original file line number Diff line number Diff line change
@@ -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
Comment on lines -45 to -63
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


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)
Comment on lines -14 to -134
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All except test_should_leave_stubbed_public_method_unchanged_after_test_when_it_was_originally_private_in_owning_module covered by https://github.com/freerange/mocha/pull/458/files#diff-2d503cd32084bef97bc2b3e3256412c7R3-R15

def stubbee
method_owner.any_instance
end

def test_should_reset_expectations_after_test
Expand All @@ -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
Comment on lines -150 to -208
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


# 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
Expand Down Expand Up @@ -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