mocha-macruby 0.9.8.20100129120100

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. data/COPYING +3 -0
  2. data/MIT-LICENSE +7 -0
  3. data/README +39 -0
  4. data/RELEASE +294 -0
  5. data/Rakefile +214 -0
  6. data/examples/misc.rb +43 -0
  7. data/examples/mocha.rb +25 -0
  8. data/examples/stubba.rb +64 -0
  9. data/lib/mocha.rb +3 -0
  10. data/lib/mocha/any_instance_method.rb +59 -0
  11. data/lib/mocha/api.rb +173 -0
  12. data/lib/mocha/argument_iterator.rb +21 -0
  13. data/lib/mocha/backtrace_filter.rb +17 -0
  14. data/lib/mocha/cardinality.rb +95 -0
  15. data/lib/mocha/central.rb +27 -0
  16. data/lib/mocha/change_state_side_effect.rb +19 -0
  17. data/lib/mocha/class_method.rb +117 -0
  18. data/lib/mocha/configuration.rb +79 -0
  19. data/lib/mocha/deprecation.rb +22 -0
  20. data/lib/mocha/exception_raiser.rb +17 -0
  21. data/lib/mocha/expectation.rb +476 -0
  22. data/lib/mocha/expectation_error.rb +15 -0
  23. data/lib/mocha/expectation_list.rb +50 -0
  24. data/lib/mocha/in_state_ordering_constraint.rb +19 -0
  25. data/lib/mocha/inspect.rb +67 -0
  26. data/lib/mocha/instance_method.rb +16 -0
  27. data/lib/mocha/integration.rb +38 -0
  28. data/lib/mocha/integration/mini_test.rb +21 -0
  29. data/lib/mocha/integration/mini_test/assertion_counter.rb +23 -0
  30. data/lib/mocha/integration/mini_test/version_131_and_above.rb +50 -0
  31. data/lib/mocha/integration/test_unit.rb +40 -0
  32. data/lib/mocha/integration/test_unit/assertion_counter.rb +23 -0
  33. data/lib/mocha/integration/test_unit/gem_version_200.rb +49 -0
  34. data/lib/mocha/integration/test_unit/gem_version_201_and_above.rb +49 -0
  35. data/lib/mocha/integration/test_unit/ruby_version_185_and_below.rb +48 -0
  36. data/lib/mocha/integration/test_unit/ruby_version_186_and_above.rb +50 -0
  37. data/lib/mocha/is_a.rb +9 -0
  38. data/lib/mocha/logger.rb +15 -0
  39. data/lib/mocha/metaclass.rb +13 -0
  40. data/lib/mocha/method_matcher.rb +21 -0
  41. data/lib/mocha/mock.rb +200 -0
  42. data/lib/mocha/mockery.rb +181 -0
  43. data/lib/mocha/module_method.rb +16 -0
  44. data/lib/mocha/multiple_yields.rb +20 -0
  45. data/lib/mocha/names.rb +53 -0
  46. data/lib/mocha/no_yields.rb +11 -0
  47. data/lib/mocha/object.rb +187 -0
  48. data/lib/mocha/parameter_matchers.rb +27 -0
  49. data/lib/mocha/parameter_matchers/all_of.rb +42 -0
  50. data/lib/mocha/parameter_matchers/any_of.rb +47 -0
  51. data/lib/mocha/parameter_matchers/any_parameters.rb +40 -0
  52. data/lib/mocha/parameter_matchers/anything.rb +33 -0
  53. data/lib/mocha/parameter_matchers/base.rb +15 -0
  54. data/lib/mocha/parameter_matchers/equals.rb +42 -0
  55. data/lib/mocha/parameter_matchers/has_entries.rb +45 -0
  56. data/lib/mocha/parameter_matchers/has_entry.rb +57 -0
  57. data/lib/mocha/parameter_matchers/has_key.rb +43 -0
  58. data/lib/mocha/parameter_matchers/has_value.rb +43 -0
  59. data/lib/mocha/parameter_matchers/includes.rb +41 -0
  60. data/lib/mocha/parameter_matchers/instance_of.rb +42 -0
  61. data/lib/mocha/parameter_matchers/is_a.rb +42 -0
  62. data/lib/mocha/parameter_matchers/kind_of.rb +42 -0
  63. data/lib/mocha/parameter_matchers/not.rb +42 -0
  64. data/lib/mocha/parameter_matchers/object.rb +15 -0
  65. data/lib/mocha/parameter_matchers/optionally.rb +55 -0
  66. data/lib/mocha/parameter_matchers/regexp_matches.rb +44 -0
  67. data/lib/mocha/parameter_matchers/responds_with.rb +43 -0
  68. data/lib/mocha/parameter_matchers/yaml_equivalent.rb +43 -0
  69. data/lib/mocha/parameters_matcher.rb +37 -0
  70. data/lib/mocha/pretty_parameters.rb +28 -0
  71. data/lib/mocha/return_values.rb +31 -0
  72. data/lib/mocha/sequence.rb +42 -0
  73. data/lib/mocha/single_return_value.rb +17 -0
  74. data/lib/mocha/single_yield.rb +18 -0
  75. data/lib/mocha/standalone.rb +1 -0
  76. data/lib/mocha/state_machine.rb +91 -0
  77. data/lib/mocha/stubbing_error.rb +16 -0
  78. data/lib/mocha/unexpected_invocation.rb +18 -0
  79. data/lib/mocha/yield_parameters.rb +31 -0
  80. data/lib/mocha_standalone.rb +2 -0
  81. data/lib/stubba.rb +4 -0
  82. data/test/acceptance/acceptance_test_helper.rb +38 -0
  83. data/test/acceptance/api_test.rb +139 -0
  84. data/test/acceptance/bug_18914_test.rb +43 -0
  85. data/test/acceptance/bug_21465_test.rb +34 -0
  86. data/test/acceptance/bug_21563_test.rb +25 -0
  87. data/test/acceptance/expected_invocation_count_test.rb +196 -0
  88. data/test/acceptance/failure_messages_test.rb +64 -0
  89. data/test/acceptance/minitest_test.rb +153 -0
  90. data/test/acceptance/mocha_example_test.rb +98 -0
  91. data/test/acceptance/mocha_test_result_test.rb +84 -0
  92. data/test/acceptance/mock_test.rb +100 -0
  93. data/test/acceptance/mock_with_initializer_block_test.rb +51 -0
  94. data/test/acceptance/mocked_methods_dispatch_test.rb +78 -0
  95. data/test/acceptance/optional_parameters_test.rb +70 -0
  96. data/test/acceptance/parameter_matcher_test.rb +209 -0
  97. data/test/acceptance/partial_mocks_test.rb +47 -0
  98. data/test/acceptance/return_value_test.rb +52 -0
  99. data/test/acceptance/sequence_test.rb +186 -0
  100. data/test/acceptance/states_test.rb +70 -0
  101. data/test/acceptance/stub_any_instance_method_test.rb +195 -0
  102. data/test/acceptance/stub_class_method_test.rb +203 -0
  103. data/test/acceptance/stub_everything_test.rb +56 -0
  104. data/test/acceptance/stub_instance_method_test.rb +203 -0
  105. data/test/acceptance/stub_module_method_test.rb +163 -0
  106. data/test/acceptance/stub_test.rb +52 -0
  107. data/test/acceptance/stubba_example_test.rb +102 -0
  108. data/test/acceptance/stubba_test.rb +15 -0
  109. data/test/acceptance/stubba_test_result_test.rb +66 -0
  110. data/test/acceptance/stubbing_error_backtrace_test.rb +64 -0
  111. data/test/acceptance/stubbing_method_unnecessarily_test.rb +65 -0
  112. data/test/acceptance/stubbing_non_existent_any_instance_method_test.rb +130 -0
  113. data/test/acceptance/stubbing_non_existent_class_method_test.rb +157 -0
  114. data/test/acceptance/stubbing_non_existent_instance_method_test.rb +147 -0
  115. data/test/acceptance/stubbing_non_public_any_instance_method_test.rb +130 -0
  116. data/test/acceptance/stubbing_non_public_class_method_test.rb +163 -0
  117. data/test/acceptance/stubbing_non_public_instance_method_test.rb +143 -0
  118. data/test/acceptance/stubbing_on_non_mock_object_test.rb +64 -0
  119. data/test/deprecation_disabler.rb +15 -0
  120. data/test/execution_point.rb +36 -0
  121. data/test/method_definer.rb +24 -0
  122. data/test/simple_counter.rb +13 -0
  123. data/test/test_helper.rb +25 -0
  124. data/test/test_runner.rb +33 -0
  125. data/test/unit/any_instance_method_test.rb +126 -0
  126. data/test/unit/array_inspect_test.rb +16 -0
  127. data/test/unit/backtrace_filter_test.rb +19 -0
  128. data/test/unit/cardinality_test.rb +56 -0
  129. data/test/unit/central_test.rb +65 -0
  130. data/test/unit/change_state_side_effect_test.rb +41 -0
  131. data/test/unit/class_method_test.rb +295 -0
  132. data/test/unit/configuration_test.rb +38 -0
  133. data/test/unit/date_time_inspect_test.rb +21 -0
  134. data/test/unit/exception_raiser_test.rb +42 -0
  135. data/test/unit/expectation_list_test.rb +57 -0
  136. data/test/unit/expectation_test.rb +480 -0
  137. data/test/unit/hash_inspect_test.rb +16 -0
  138. data/test/unit/in_state_ordering_constraint_test.rb +43 -0
  139. data/test/unit/metaclass_test.rb +22 -0
  140. data/test/unit/method_matcher_test.rb +23 -0
  141. data/test/unit/mock_test.rb +302 -0
  142. data/test/unit/mockery_test.rb +149 -0
  143. data/test/unit/multiple_yields_test.rb +18 -0
  144. data/test/unit/no_yields_test.rb +18 -0
  145. data/test/unit/object_inspect_test.rb +37 -0
  146. data/test/unit/object_test.rb +82 -0
  147. data/test/unit/parameter_matchers/all_of_test.rb +26 -0
  148. data/test/unit/parameter_matchers/any_of_test.rb +26 -0
  149. data/test/unit/parameter_matchers/anything_test.rb +21 -0
  150. data/test/unit/parameter_matchers/equals_test.rb +25 -0
  151. data/test/unit/parameter_matchers/has_entries_test.rb +51 -0
  152. data/test/unit/parameter_matchers/has_entry_test.rb +82 -0
  153. data/test/unit/parameter_matchers/has_key_test.rb +55 -0
  154. data/test/unit/parameter_matchers/has_value_test.rb +57 -0
  155. data/test/unit/parameter_matchers/includes_test.rb +44 -0
  156. data/test/unit/parameter_matchers/instance_of_test.rb +25 -0
  157. data/test/unit/parameter_matchers/is_a_test.rb +25 -0
  158. data/test/unit/parameter_matchers/kind_of_test.rb +25 -0
  159. data/test/unit/parameter_matchers/not_test.rb +26 -0
  160. data/test/unit/parameter_matchers/regexp_matches_test.rb +46 -0
  161. data/test/unit/parameter_matchers/responds_with_test.rb +25 -0
  162. data/test/unit/parameter_matchers/stub_matcher.rb +27 -0
  163. data/test/unit/parameter_matchers/yaml_equivalent_test.rb +25 -0
  164. data/test/unit/parameters_matcher_test.rb +121 -0
  165. data/test/unit/return_values_test.rb +63 -0
  166. data/test/unit/sequence_test.rb +104 -0
  167. data/test/unit/single_return_value_test.rb +14 -0
  168. data/test/unit/single_yield_test.rb +18 -0
  169. data/test/unit/state_machine_test.rb +98 -0
  170. data/test/unit/string_inspect_test.rb +11 -0
  171. data/test/unit/yield_parameters_test.rb +93 -0
  172. metadata +240 -0
@@ -0,0 +1,52 @@
1
+ require File.join(File.dirname(__FILE__), "acceptance_test_helper")
2
+ require 'mocha'
3
+
4
+ class ReturnValueTest < Test::Unit::TestCase
5
+
6
+ include AcceptanceTest
7
+
8
+ def setup
9
+ setup_acceptance_test
10
+ end
11
+
12
+ def teardown
13
+ teardown_acceptance_test
14
+ end
15
+
16
+ def test_should_build_mock_and_explicitly_add_an_expectation_with_a_return_value
17
+ test_result = run_as_test do
18
+ foo = mock('foo')
19
+ foo.expects(:bar).returns('bar')
20
+ assert_equal 'bar', foo.bar
21
+ end
22
+ assert_passed(test_result)
23
+ end
24
+
25
+ def test_should_build_mock_incorporating_two_expectations_with_return_values
26
+ test_result = run_as_test do
27
+ foo = mock('foo', :bar => 'bar', :baz => 'baz')
28
+ assert_equal 'bar', foo.bar
29
+ assert_equal 'baz', foo.baz
30
+ end
31
+ assert_passed(test_result)
32
+ end
33
+
34
+ def test_should_build_stub_and_explicitly_add_an_expectation_with_a_return_value
35
+ test_result = run_as_test do
36
+ foo = stub('foo')
37
+ foo.stubs(:bar).returns('bar')
38
+ assert_equal 'bar', foo.bar
39
+ end
40
+ assert_passed(test_result)
41
+ end
42
+
43
+ def test_should_build_stub_incorporating_two_expectations_with_return_values
44
+ test_result = run_as_test do
45
+ foo = stub('foo', :bar => 'bar', :baz => 'baz')
46
+ assert_equal 'bar', foo.bar
47
+ assert_equal 'baz', foo.baz
48
+ end
49
+ assert_passed(test_result)
50
+ end
51
+
52
+ end
@@ -0,0 +1,186 @@
1
+ require File.join(File.dirname(__FILE__), "acceptance_test_helper")
2
+ require 'mocha'
3
+
4
+ class SequenceTest < Test::Unit::TestCase
5
+
6
+ include AcceptanceTest
7
+
8
+ def setup
9
+ setup_acceptance_test
10
+ end
11
+
12
+ def teardown
13
+ teardown_acceptance_test
14
+ end
15
+
16
+ def test_should_constrain_invocations_to_occur_in_expected_order
17
+ test_result = run_as_test do
18
+ mock = mock()
19
+ sequence = sequence('one')
20
+
21
+ mock.expects(:first).in_sequence(sequence)
22
+ mock.expects(:second).in_sequence(sequence)
23
+
24
+ mock.second
25
+ end
26
+ assert_failed(test_result)
27
+ end
28
+
29
+ def test_should_allow_invocations_in_sequence
30
+ test_result = run_as_test do
31
+ mock = mock()
32
+ sequence = sequence('one')
33
+
34
+ mock.expects(:first).in_sequence(sequence)
35
+ mock.expects(:second).in_sequence(sequence)
36
+
37
+ mock.first
38
+ mock.second
39
+ end
40
+ assert_passed(test_result)
41
+ end
42
+
43
+ def test_should_constrain_invocations_to_occur_in_expected_order_even_if_expected_on_different_mocks
44
+ test_result = run_as_test do
45
+ mock_one = mock('1')
46
+ mock_two = mock('2')
47
+ sequence = sequence('one')
48
+
49
+ mock_one.expects(:first).in_sequence(sequence)
50
+ mock_two.expects(:second).in_sequence(sequence)
51
+
52
+ mock_two.second
53
+ end
54
+ assert_failed(test_result)
55
+ end
56
+
57
+ def test_should_allow_invocations_in_sequence_even_if_expected_on_different_mocks
58
+ test_result = run_as_test do
59
+ mock_one = mock('1')
60
+ mock_two = mock('2')
61
+ sequence = sequence('one')
62
+
63
+ mock_one.expects(:first).in_sequence(sequence)
64
+ mock_two.expects(:second).in_sequence(sequence)
65
+
66
+ mock_one.first
67
+ mock_two.second
68
+ end
69
+ assert_passed(test_result)
70
+ end
71
+
72
+ def test_should_constrain_invocations_to_occur_in_expected_order_even_if_expected_on_partial_mocks
73
+ test_result = run_as_test do
74
+ partial_mock_one = "1"
75
+ partial_mock_two = "2"
76
+ sequence = sequence('one')
77
+
78
+ partial_mock_one.expects(:first).in_sequence(sequence)
79
+ partial_mock_two.expects(:second).in_sequence(sequence)
80
+
81
+ partial_mock_two.second
82
+ end
83
+ assert_failed(test_result)
84
+ end
85
+
86
+ def test_should_allow_invocations_in_sequence_even_if_expected_on_partial_mocks
87
+ test_result = run_as_test do
88
+ partial_mock_one = "1"
89
+ partial_mock_two = "2"
90
+ sequence = sequence('one')
91
+
92
+ partial_mock_one.expects(:first).in_sequence(sequence)
93
+ partial_mock_two.expects(:second).in_sequence(sequence)
94
+
95
+ partial_mock_one.first
96
+ partial_mock_two.second
97
+ end
98
+ assert_passed(test_result)
99
+ end
100
+
101
+ def test_should_allow_stub_expectations_to_be_skipped_in_sequence
102
+ test_result = run_as_test do
103
+ mock = mock()
104
+ sequence = sequence('one')
105
+
106
+ mock.expects(:first).in_sequence(sequence)
107
+ mock.stubs(:second).in_sequence(sequence)
108
+ mock.expects(:third).in_sequence(sequence)
109
+
110
+ mock.first
111
+ mock.third
112
+ end
113
+ assert_passed(test_result)
114
+ end
115
+
116
+ def test_should_regard_sequences_as_independent_of_each_other
117
+ test_result = run_as_test do
118
+ mock = mock()
119
+ sequence_one = sequence('one')
120
+ sequence_two = sequence('two')
121
+
122
+ mock.expects(:first).in_sequence(sequence_one)
123
+ mock.expects(:second).in_sequence(sequence_one)
124
+
125
+ mock.expects(:third).in_sequence(sequence_two)
126
+ mock.expects(:fourth).in_sequence(sequence_two)
127
+
128
+ mock.first
129
+ mock.third
130
+ mock.second
131
+ mock.fourth
132
+ end
133
+ assert_passed(test_result)
134
+ end
135
+
136
+ def test_should_include_sequence_in_failure_message
137
+ test_result = run_as_test do
138
+ mock = mock()
139
+ sequence = sequence('one')
140
+
141
+ mock.expects(:first).in_sequence(sequence)
142
+ mock.expects(:second).in_sequence(sequence)
143
+
144
+ mock.second
145
+ end
146
+ assert_failed(test_result)
147
+ assert_match Regexp.new("in sequence 'one'"), test_result.failures.first.message
148
+ end
149
+
150
+ def test_should_allow_expectations_to_be_in_more_than_one_sequence
151
+ test_result = run_as_test do
152
+ mock = mock()
153
+ sequence_one = sequence('one')
154
+ sequence_two = sequence('two')
155
+
156
+ mock.expects(:first).in_sequence(sequence_one)
157
+ mock.expects(:second).in_sequence(sequence_two)
158
+ mock.expects(:three).in_sequence(sequence_one).in_sequence(sequence_two)
159
+
160
+ mock.first
161
+ mock.three
162
+ end
163
+ assert_failed(test_result)
164
+ assert_match Regexp.new("in sequence 'one'"), test_result.failures.first.message
165
+ assert_match Regexp.new("in sequence 'two'"), test_result.failures.first.message
166
+ end
167
+
168
+ def test_should_have_shortcut_for_expectations_to_be_in_more_than_one_sequence
169
+ test_result = run_as_test do
170
+ mock = mock()
171
+ sequence_one = sequence('one')
172
+ sequence_two = sequence('two')
173
+
174
+ mock.expects(:first).in_sequence(sequence_one)
175
+ mock.expects(:second).in_sequence(sequence_two)
176
+ mock.expects(:three).in_sequence(sequence_one, sequence_two)
177
+
178
+ mock.first
179
+ mock.three
180
+ end
181
+ assert_failed(test_result)
182
+ assert_match Regexp.new("in sequence 'one'"), test_result.failures.first.message
183
+ assert_match Regexp.new("in sequence 'two'"), test_result.failures.first.message
184
+ end
185
+
186
+ end
@@ -0,0 +1,70 @@
1
+ require File.join(File.dirname(__FILE__), "acceptance_test_helper")
2
+ require 'mocha'
3
+
4
+ class StatesTest < Test::Unit::TestCase
5
+
6
+ include AcceptanceTest
7
+
8
+ def setup
9
+ setup_acceptance_test
10
+ end
11
+
12
+ def teardown
13
+ teardown_acceptance_test
14
+ end
15
+
16
+ def test_should_constrain_expectations_to_occur_within_a_given_state
17
+ test_result = run_as_test do
18
+ mock = mock()
19
+ readiness = states('readiness')
20
+
21
+ mock.stubs(:first).when(readiness.is('ready'))
22
+ mock.stubs(:second).then(readiness.is('ready'))
23
+
24
+ mock.first
25
+ end
26
+ assert_failed(test_result)
27
+ end
28
+
29
+ def test_should_allow_expectations_to_occur_in_correct_state
30
+ test_result = run_as_test do
31
+ mock = mock()
32
+ readiness = states('readiness')
33
+
34
+ mock.stubs(:first).when(readiness.is('ready'))
35
+ mock.stubs(:second).then(readiness.is('ready'))
36
+
37
+ mock.second
38
+ mock.first
39
+ end
40
+ assert_passed(test_result)
41
+ end
42
+
43
+ def test_should_be_able_to_start_in_a_specific_state
44
+ test_result = run_as_test do
45
+ mock = mock()
46
+ readiness = states('readiness')
47
+
48
+ mock.stubs(:first).when(readiness.is('ready'))
49
+
50
+ readiness.starts_as('ready')
51
+ mock.first
52
+ end
53
+ assert_passed(test_result)
54
+ end
55
+
56
+ def test_should_switch_state_when_method_raises_an_exception
57
+ test_result = run_as_test do
58
+ mock = mock()
59
+ readiness = states('readiness')
60
+
61
+ mock.expects(:first).raises().then(readiness.is('ready'))
62
+ mock.expects(:second).when(readiness.is('ready'))
63
+
64
+ mock.first rescue nil
65
+ mock.second
66
+ end
67
+ assert_passed(test_result)
68
+ end
69
+
70
+ end
@@ -0,0 +1,195 @@
1
+ require File.join(File.dirname(__FILE__), "acceptance_test_helper")
2
+ require 'mocha'
3
+
4
+ class StubAnyInstanceMethodTest < Test::Unit::TestCase
5
+
6
+ include AcceptanceTest
7
+
8
+ def setup
9
+ setup_acceptance_test
10
+ end
11
+
12
+ def teardown
13
+ teardown_acceptance_test
14
+ end
15
+
16
+ def test_should_stub_method_within_test
17
+ klass = Class.new do
18
+ def my_instance_method
19
+ :original_return_value
20
+ end
21
+ end
22
+ instance = klass.new
23
+ test_result = run_as_test do
24
+ klass.any_instance.stubs(:my_instance_method).returns(:new_return_value)
25
+ assert_equal :new_return_value, instance.my_instance_method
26
+ end
27
+ assert_passed(test_result)
28
+ end
29
+
30
+ def test_should_leave_stubbed_public_method_unchanged_after_test
31
+ klass = Class.new do
32
+ def my_instance_method
33
+ :original_return_value
34
+ end
35
+ end
36
+ instance = klass.new
37
+ run_as_test do
38
+ klass.any_instance.stubs(:my_instance_method).returns(:new_return_value)
39
+ end
40
+ assert instance.public_methods(false).any? { |m| m.to_s == 'my_instance_method' }
41
+ assert_equal :original_return_value, instance.my_instance_method
42
+ end
43
+
44
+ def test_should_leave_stubbed_protected_method_unchanged_after_test
45
+ klass = Class.new do
46
+ def my_instance_method
47
+ :original_return_value
48
+ end
49
+ protected :my_instance_method
50
+ end
51
+ instance = klass.new
52
+ run_as_test do
53
+ klass.any_instance.stubs(:my_instance_method).returns(:new_return_value)
54
+ end
55
+ assert instance.protected_methods(false).any? { |m| m.to_s == 'my_instance_method' }
56
+ assert_equal :original_return_value, instance.send(:my_instance_method)
57
+ end
58
+
59
+ def test_should_leave_stubbed_private_method_unchanged_after_test
60
+ klass = Class.new do
61
+ def my_instance_method
62
+ :original_return_value
63
+ end
64
+ private :my_instance_method
65
+ end
66
+ instance = klass.new
67
+ run_as_test do
68
+ klass.any_instance.stubs(:my_instance_method).returns(:new_return_value)
69
+ end
70
+ assert instance.private_methods(false).any? { |m| m.to_s == 'my_instance_method' }
71
+ assert_equal :original_return_value, instance.send(:my_instance_method)
72
+ end
73
+
74
+ def test_should_reset_expectations_after_test
75
+ klass = Class.new do
76
+ def my_instance_method
77
+ :original_return_value
78
+ end
79
+ end
80
+ instance = klass.new
81
+ run_as_test do
82
+ klass.any_instance.stubs(:my_instance_method).returns(:new_return_value)
83
+ end
84
+ assert_equal 0, klass.any_instance.mocha.expectations.length
85
+ end
86
+
87
+ def test_should_be_able_to_stub_a_superclass_method
88
+ superklass = Class.new do
89
+ def my_superclass_method
90
+ :original_return_value
91
+ end
92
+ end
93
+ klass = Class.new(superklass)
94
+ instance = klass.new
95
+ test_result = run_as_test do
96
+ klass.any_instance.stubs(:my_superclass_method).returns(:new_return_value)
97
+ assert_equal :new_return_value, instance.my_superclass_method
98
+ end
99
+ assert_passed(test_result)
100
+ assert instance.public_methods(true).any? { |m| m.to_s == 'my_superclass_method' }
101
+ assert !klass.public_methods(false).any? { |m| m.to_s == 'my_superclass_method' }
102
+ assert_equal :original_return_value, instance.my_superclass_method
103
+ end
104
+
105
+ 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
106
+ ruby18_klass = Class.new do
107
+ class << self
108
+ def public_instance_methods(include_superclass = true)
109
+ ['my_instance_method']
110
+ end
111
+ end
112
+ end
113
+ test_result = run_as_test do
114
+ ruby18_klass.any_instance.stubs(:my_instance_method).returns(:new_return_value)
115
+ assert_equal :new_return_value, ruby18_klass.new.my_instance_method
116
+ end
117
+ assert_passed(test_result)
118
+ end
119
+
120
+ def test_should_be_able_to_stub_method_if_ruby19_public_instance_methods_include_method_but_method_does_not_actually_exist_like_active_record_association_proxy
121
+ ruby19_klass = Class.new do
122
+ class << self
123
+ def public_instance_methods(include_superclass = true)
124
+ [:my_instance_method]
125
+ end
126
+ end
127
+ end
128
+ test_result = run_as_test do
129
+ ruby19_klass.any_instance.stubs(:my_instance_method).returns(:new_return_value)
130
+ assert_equal :new_return_value, ruby19_klass.new.my_instance_method
131
+ end
132
+ assert_passed(test_result)
133
+ end
134
+
135
+ def test_should_be_able_to_stub_method_if_ruby18_protected_instance_methods_include_method_but_method_does_not_actually_exist_like_active_record_association_proxy
136
+ ruby18_klass = Class.new do
137
+ class << self
138
+ def protected_instance_methods(include_superclass = true)
139
+ ['my_instance_method']
140
+ end
141
+ end
142
+ end
143
+ test_result = run_as_test do
144
+ ruby18_klass.any_instance.stubs(:my_instance_method).returns(:new_return_value)
145
+ assert_equal :new_return_value, ruby18_klass.new.my_instance_method
146
+ end
147
+ assert_passed(test_result)
148
+ end
149
+
150
+ def test_should_be_able_to_stub_method_if_ruby19_protected_instance_methods_include_method_but_method_does_not_actually_exist_like_active_record_association_proxy
151
+ ruby19_klass = Class.new do
152
+ class << self
153
+ def protected_instance_methods(include_superclass = true)
154
+ [:my_instance_method]
155
+ end
156
+ end
157
+ end
158
+ test_result = run_as_test do
159
+ ruby19_klass.any_instance.stubs(:my_instance_method).returns(:new_return_value)
160
+ assert_equal :new_return_value, ruby19_klass.new.my_instance_method
161
+ end
162
+ assert_passed(test_result)
163
+ end
164
+
165
+ def test_should_be_able_to_stub_method_if_ruby18_private_instance_methods_include_method_but_method_does_not_actually_exist_like_active_record_association_proxy
166
+ ruby18_klass = Class.new do
167
+ class << self
168
+ def private_instance_methods(include_superclass = true)
169
+ ['my_instance_method']
170
+ end
171
+ end
172
+ end
173
+ test_result = run_as_test do
174
+ ruby18_klass.any_instance.stubs(:my_instance_method).returns(:new_return_value)
175
+ assert_equal :new_return_value, ruby18_klass.new.my_instance_method
176
+ end
177
+ assert_passed(test_result)
178
+ end
179
+
180
+ def test_should_be_able_to_stub_method_if_ruby19_private_instance_methods_include_method_but_method_does_not_actually_exist_like_active_record_association_proxy
181
+ ruby19_klass = Class.new do
182
+ class << self
183
+ def private_instance_methods(include_superclass = true)
184
+ [:my_instance_method]
185
+ end
186
+ end
187
+ end
188
+ test_result = run_as_test do
189
+ ruby19_klass.any_instance.stubs(:my_instance_method).returns(:new_return_value)
190
+ assert_equal :new_return_value, ruby19_klass.new.my_instance_method
191
+ end
192
+ assert_passed(test_result)
193
+ end
194
+
195
+ end