jferris-mocha 0.9.5.0.1240002286
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.
- data/COPYING +3 -0
- data/MIT-LICENSE +7 -0
- data/README +37 -0
- data/RELEASE +269 -0
- data/Rakefile +217 -0
- data/examples/misc.rb +43 -0
- data/examples/mocha.rb +25 -0
- data/examples/stubba.rb +64 -0
- data/lib/mocha/any_instance_method.rb +55 -0
- data/lib/mocha/api.rb +232 -0
- data/lib/mocha/argument_iterator.rb +21 -0
- data/lib/mocha/backtrace_filter.rb +17 -0
- data/lib/mocha/cardinality.rb +95 -0
- data/lib/mocha/central.rb +27 -0
- data/lib/mocha/change_state_side_effect.rb +19 -0
- data/lib/mocha/class_method.rb +87 -0
- data/lib/mocha/configuration.rb +60 -0
- data/lib/mocha/deprecation.rb +22 -0
- data/lib/mocha/exception_raiser.rb +17 -0
- data/lib/mocha/expectation.rb +484 -0
- data/lib/mocha/expectation_error.rb +15 -0
- data/lib/mocha/expectation_list.rb +50 -0
- data/lib/mocha/in_state_ordering_constraint.rb +19 -0
- data/lib/mocha/inspect.rb +67 -0
- data/lib/mocha/instance_method.rb +16 -0
- data/lib/mocha/integration/bacon/assertion_counter.rb +23 -0
- data/lib/mocha/integration/bacon/version_11_and_above.rb +34 -0
- data/lib/mocha/integration/bacon.rb +1 -0
- data/lib/mocha/integration/mini_test/assertion_counter.rb +23 -0
- data/lib/mocha/integration/mini_test/version_131_and_above.rb +49 -0
- data/lib/mocha/integration/mini_test.rb +1 -0
- data/lib/mocha/integration/test_unit/assertion_counter.rb +23 -0
- data/lib/mocha/integration/test_unit/gem_version_200.rb +49 -0
- data/lib/mocha/integration/test_unit/gem_version_201_and_above.rb +49 -0
- data/lib/mocha/integration/test_unit/ruby_version_185_and_below.rb +48 -0
- data/lib/mocha/integration/test_unit/ruby_version_186_and_above.rb +50 -0
- data/lib/mocha/integration/test_unit.rb +4 -0
- data/lib/mocha/invocation.rb +10 -0
- data/lib/mocha/is_a.rb +9 -0
- data/lib/mocha/logger.rb +15 -0
- data/lib/mocha/metaclass.rb +13 -0
- data/lib/mocha/method_matcher.rb +21 -0
- data/lib/mocha/mock.rb +200 -0
- data/lib/mocha/mockery.rb +189 -0
- data/lib/mocha/module_method.rb +16 -0
- data/lib/mocha/multiple_yields.rb +20 -0
- data/lib/mocha/names.rb +53 -0
- data/lib/mocha/no_yields.rb +11 -0
- data/lib/mocha/object.rb +187 -0
- data/lib/mocha/parameter_matchers/all_of.rb +42 -0
- data/lib/mocha/parameter_matchers/any_of.rb +47 -0
- data/lib/mocha/parameter_matchers/any_parameters.rb +40 -0
- data/lib/mocha/parameter_matchers/anything.rb +33 -0
- data/lib/mocha/parameter_matchers/base.rb +15 -0
- data/lib/mocha/parameter_matchers/equals.rb +42 -0
- data/lib/mocha/parameter_matchers/has_entries.rb +45 -0
- data/lib/mocha/parameter_matchers/has_entry.rb +57 -0
- data/lib/mocha/parameter_matchers/has_key.rb +42 -0
- data/lib/mocha/parameter_matchers/has_value.rb +42 -0
- data/lib/mocha/parameter_matchers/includes.rb +40 -0
- data/lib/mocha/parameter_matchers/instance_of.rb +42 -0
- data/lib/mocha/parameter_matchers/is_a.rb +42 -0
- data/lib/mocha/parameter_matchers/kind_of.rb +42 -0
- data/lib/mocha/parameter_matchers/not.rb +42 -0
- data/lib/mocha/parameter_matchers/object.rb +15 -0
- data/lib/mocha/parameter_matchers/optionally.rb +55 -0
- data/lib/mocha/parameter_matchers/regexp_matches.rb +43 -0
- data/lib/mocha/parameter_matchers/responds_with.rb +43 -0
- data/lib/mocha/parameter_matchers/yaml_equivalent.rb +43 -0
- data/lib/mocha/parameter_matchers.rb +27 -0
- data/lib/mocha/parameters_matcher.rb +37 -0
- data/lib/mocha/pretty_parameters.rb +28 -0
- data/lib/mocha/return_values.rb +31 -0
- data/lib/mocha/sequence.rb +42 -0
- data/lib/mocha/single_return_value.rb +17 -0
- data/lib/mocha/single_yield.rb +18 -0
- data/lib/mocha/state_machine.rb +91 -0
- data/lib/mocha/stubbing_error.rb +16 -0
- data/lib/mocha/unexpected_invocation.rb +18 -0
- data/lib/mocha/yield_parameters.rb +31 -0
- data/lib/mocha.rb +69 -0
- data/lib/mocha_standalone.rb +2 -0
- data/lib/stubba.rb +4 -0
- data/test/acceptance/acceptance_test_helper.rb +38 -0
- data/test/acceptance/api_test.rb +139 -0
- data/test/acceptance/bacon_spec.rb +67 -0
- data/test/acceptance/bacon_test.rb +110 -0
- data/test/acceptance/bug_18914_test.rb +43 -0
- data/test/acceptance/bug_21465_test.rb +34 -0
- data/test/acceptance/bug_21563_test.rb +25 -0
- data/test/acceptance/expected_invocation_count_test.rb +196 -0
- data/test/acceptance/failure_messages_test.rb +64 -0
- data/test/acceptance/minitest_test.rb +146 -0
- data/test/acceptance/mocha_example_test.rb +98 -0
- data/test/acceptance/mocha_test_result_test.rb +84 -0
- data/test/acceptance/mock_test.rb +100 -0
- data/test/acceptance/mock_with_initializer_block_test.rb +51 -0
- data/test/acceptance/mocked_methods_dispatch_test.rb +78 -0
- data/test/acceptance/optional_parameters_test.rb +70 -0
- data/test/acceptance/parameter_matcher_test.rb +209 -0
- data/test/acceptance/partial_mocks_test.rb +47 -0
- data/test/acceptance/return_value_test.rb +52 -0
- data/test/acceptance/sequence_test.rb +186 -0
- data/test/acceptance/spy_test.rb +109 -0
- data/test/acceptance/states_test.rb +70 -0
- data/test/acceptance/stub_any_instance_method_test.rb +195 -0
- data/test/acceptance/stub_class_method_test.rb +203 -0
- data/test/acceptance/stub_everything_test.rb +56 -0
- data/test/acceptance/stub_instance_method_test.rb +203 -0
- data/test/acceptance/stub_module_method_test.rb +163 -0
- data/test/acceptance/stub_test.rb +52 -0
- data/test/acceptance/stubba_example_test.rb +102 -0
- data/test/acceptance/stubba_test.rb +15 -0
- data/test/acceptance/stubba_test_result_test.rb +66 -0
- data/test/acceptance/stubbing_error_backtrace_test.rb +64 -0
- data/test/acceptance/stubbing_method_unnecessarily_test.rb +65 -0
- data/test/acceptance/stubbing_non_existent_any_instance_method_test.rb +130 -0
- data/test/acceptance/stubbing_non_existent_class_method_test.rb +157 -0
- data/test/acceptance/stubbing_non_existent_instance_method_test.rb +147 -0
- data/test/acceptance/stubbing_non_public_any_instance_method_test.rb +130 -0
- data/test/acceptance/stubbing_non_public_class_method_test.rb +163 -0
- data/test/acceptance/stubbing_non_public_instance_method_test.rb +143 -0
- data/test/acceptance/stubbing_on_non_mock_object_test.rb +64 -0
- data/test/deprecation_disabler.rb +15 -0
- data/test/execution_point.rb +36 -0
- data/test/matcher_helpers.rb +5 -0
- data/test/method_definer.rb +24 -0
- data/test/simple_counter.rb +13 -0
- data/test/test_helper.rb +16 -0
- data/test/test_runner.rb +33 -0
- data/test/unit/any_instance_method_test.rb +126 -0
- data/test/unit/array_inspect_test.rb +16 -0
- data/test/unit/assert_received_test.rb +136 -0
- data/test/unit/backtrace_filter_test.rb +19 -0
- data/test/unit/cardinality_test.rb +56 -0
- data/test/unit/central_test.rb +65 -0
- data/test/unit/change_state_side_effect_test.rb +41 -0
- data/test/unit/class_method_test.rb +237 -0
- data/test/unit/date_time_inspect_test.rb +21 -0
- data/test/unit/exception_raiser_test.rb +42 -0
- data/test/unit/expectation_list_test.rb +57 -0
- data/test/unit/expectation_test.rb +526 -0
- data/test/unit/hash_inspect_test.rb +16 -0
- data/test/unit/have_received_test.rb +137 -0
- data/test/unit/in_state_ordering_constraint_test.rb +43 -0
- data/test/unit/invocation_test.rb +17 -0
- data/test/unit/metaclass_test.rb +22 -0
- data/test/unit/method_matcher_test.rb +23 -0
- data/test/unit/mock_test.rb +329 -0
- data/test/unit/mockery_test.rb +163 -0
- data/test/unit/multiple_yields_test.rb +18 -0
- data/test/unit/no_yields_test.rb +18 -0
- data/test/unit/object_inspect_test.rb +37 -0
- data/test/unit/object_test.rb +82 -0
- data/test/unit/parameter_matchers/all_of_test.rb +26 -0
- data/test/unit/parameter_matchers/any_of_test.rb +26 -0
- data/test/unit/parameter_matchers/anything_test.rb +21 -0
- data/test/unit/parameter_matchers/equals_test.rb +25 -0
- data/test/unit/parameter_matchers/has_entries_test.rb +51 -0
- data/test/unit/parameter_matchers/has_entry_test.rb +82 -0
- data/test/unit/parameter_matchers/has_key_test.rb +36 -0
- data/test/unit/parameter_matchers/has_value_test.rb +37 -0
- data/test/unit/parameter_matchers/includes_test.rb +25 -0
- data/test/unit/parameter_matchers/instance_of_test.rb +25 -0
- data/test/unit/parameter_matchers/is_a_test.rb +25 -0
- data/test/unit/parameter_matchers/kind_of_test.rb +25 -0
- data/test/unit/parameter_matchers/not_test.rb +26 -0
- data/test/unit/parameter_matchers/regexp_matches_test.rb +25 -0
- data/test/unit/parameter_matchers/responds_with_test.rb +25 -0
- data/test/unit/parameter_matchers/stub_matcher.rb +27 -0
- data/test/unit/parameter_matchers/yaml_equivalent_test.rb +25 -0
- data/test/unit/parameters_matcher_test.rb +121 -0
- data/test/unit/return_values_test.rb +63 -0
- data/test/unit/sequence_test.rb +104 -0
- data/test/unit/single_return_value_test.rb +14 -0
- data/test/unit/single_yield_test.rb +18 -0
- data/test/unit/state_machine_test.rb +98 -0
- data/test/unit/string_inspect_test.rb +11 -0
- data/test/unit/yield_parameters_test.rb +93 -0
- metadata +245 -0
@@ -0,0 +1,47 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "acceptance_test_helper")
|
2
|
+
require 'mocha'
|
3
|
+
|
4
|
+
class PartialMockTest < 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_pass_if_all_expectations_are_satisfied
|
17
|
+
test_result = run_as_test do
|
18
|
+
partial_mock_one = "partial_mock_one"
|
19
|
+
partial_mock_two = "partial_mock_two"
|
20
|
+
|
21
|
+
partial_mock_one.expects(:first)
|
22
|
+
partial_mock_one.expects(:second)
|
23
|
+
partial_mock_two.expects(:third)
|
24
|
+
|
25
|
+
partial_mock_one.first
|
26
|
+
partial_mock_one.second
|
27
|
+
partial_mock_two.third
|
28
|
+
end
|
29
|
+
assert_passed(test_result)
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_should_fail_if_all_expectations_are_not_satisfied
|
33
|
+
test_result = run_as_test do
|
34
|
+
partial_mock_one = "partial_mock_one"
|
35
|
+
partial_mock_two = "partial_mock_two"
|
36
|
+
|
37
|
+
partial_mock_one.expects(:first)
|
38
|
+
partial_mock_one.expects(:second)
|
39
|
+
partial_mock_two.expects(:third)
|
40
|
+
|
41
|
+
partial_mock_one.first
|
42
|
+
partial_mock_two.third
|
43
|
+
end
|
44
|
+
assert_failed(test_result)
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
@@ -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,109 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "acceptance_test_helper")
|
2
|
+
require 'mocha'
|
3
|
+
require 'matcher_helpers'
|
4
|
+
|
5
|
+
class SpyTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
include AcceptanceTest
|
8
|
+
|
9
|
+
def setup
|
10
|
+
setup_acceptance_test
|
11
|
+
end
|
12
|
+
|
13
|
+
def teardown
|
14
|
+
teardown_acceptance_test
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_should_accept_wildcard_stub_call_without_arguments
|
18
|
+
instance = Object.new
|
19
|
+
instance.stubs(:to_s)
|
20
|
+
instance.to_s
|
21
|
+
assert_received(instance, :to_s)
|
22
|
+
assert_matcher_accepts have_received(:to_s), instance
|
23
|
+
end
|
24
|
+
|
25
|
+
def test_should_accept_wildcard_stub_call_with_arguments
|
26
|
+
instance = Object.new
|
27
|
+
instance.stubs(:to_s)
|
28
|
+
instance.to_s(:argument)
|
29
|
+
assert_received(instance, :to_s)
|
30
|
+
assert_matcher_accepts have_received(:to_s), instance
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_should_not_accept_wildcard_stub_without_call
|
34
|
+
instance = Object.new
|
35
|
+
instance.stubs(:to_s)
|
36
|
+
assert_fails { assert_received(instance, :to_s) }
|
37
|
+
assert_fails { assert_matcher_accepts have_received(:to_s), instance }
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_should_not_accept_call_without_arguments
|
41
|
+
instance = Object.new
|
42
|
+
instance.stubs(:to_s)
|
43
|
+
instance.to_s
|
44
|
+
assert_fails { assert_received(instance, :to_s) {|expect| expect.with(1) } }
|
45
|
+
assert_fails { assert_matcher_accepts have_received(:to_s).with(1), instance }
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_should_not_accept_call_with_different_arguments
|
49
|
+
instance = Object.new
|
50
|
+
instance.stubs(:to_s)
|
51
|
+
instance.to_s(2)
|
52
|
+
assert_fails { assert_received(instance, :to_s) {|expect| expect.with(1) } }
|
53
|
+
assert_fails { assert_matcher_accepts have_received(:to_s).with(1), instance }
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_should_accept_call_with_correct_arguments
|
57
|
+
instance = Object.new
|
58
|
+
instance.stubs(:to_s)
|
59
|
+
instance.to_s(1)
|
60
|
+
assert_received(instance, :to_s) {|expect| expect.with(1) }
|
61
|
+
assert_matcher_accepts have_received(:to_s).with(1), instance
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_should_accept_call_with_wildcard_arguments
|
65
|
+
instance = Object.new
|
66
|
+
instance.stubs(:to_s)
|
67
|
+
instance.to_s('hello')
|
68
|
+
assert_received(instance, :to_s) {|expect| expect.with(is_a(String)) }
|
69
|
+
assert_matcher_accepts have_received(:to_s).with(is_a(String)), instance
|
70
|
+
end
|
71
|
+
|
72
|
+
def test_should_reject_call_on_different_mock
|
73
|
+
instance = Object.new
|
74
|
+
other = Object.new
|
75
|
+
instance.stubs(:to_s)
|
76
|
+
other.stubs(:to_s)
|
77
|
+
other.to_s('hello')
|
78
|
+
assert_fails { assert_received(instance, :to_s) {|expect| expect.with(is_a(String)) } }
|
79
|
+
assert_fails { assert_matcher_accepts have_received(:to_s).with(is_a(String)), instance }
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_should_accept_correct_number_of_calls
|
83
|
+
instance = Object.new
|
84
|
+
instance.stubs(:to_s)
|
85
|
+
2.times { instance.to_s }
|
86
|
+
assert_received(instance, :to_s) {|expect| expect.twice }
|
87
|
+
assert_matcher_accepts have_received(:to_s).twice, instance
|
88
|
+
end
|
89
|
+
|
90
|
+
def test_should_reject_incorrect_number_of_calls
|
91
|
+
instance = Object.new
|
92
|
+
instance.stubs(:to_s)
|
93
|
+
instance.to_s
|
94
|
+
message = /expected exactly twice/
|
95
|
+
assert_fails(message) { assert_received(instance, :to_s) {|expect| expect.twice } }
|
96
|
+
assert_fails(message) { assert_matcher_accepts have_received(:to_s).twice, instance }
|
97
|
+
end
|
98
|
+
|
99
|
+
def assert_fails(message=/not yet invoked/)
|
100
|
+
begin
|
101
|
+
yield
|
102
|
+
rescue Test::Unit::AssertionFailedError => exception
|
103
|
+
assert_match message, exception.message, "Test failed, but with the wrong message"
|
104
|
+
return
|
105
|
+
end
|
106
|
+
flunk("Expected to fail")
|
107
|
+
end
|
108
|
+
|
109
|
+
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
|