bourne 1.0

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.
@@ -0,0 +1,192 @@
1
+ require File.join(File.dirname(__FILE__), "..", "test_helper")
2
+ require 'test_runner'
3
+ require 'bourne/api'
4
+ require 'bourne/mockery'
5
+ require 'mocha/object'
6
+ require 'matcher_helpers'
7
+
8
+ module HaveReceivedTestMethods
9
+
10
+ include Mocha
11
+
12
+ def teardown
13
+ Mockery.reset_instance
14
+ end
15
+
16
+ def test_passes_if_invocation_exists
17
+ method = :a_method
18
+ mock = new_mock('a mock')
19
+ Mockery.instance.invocation(mock, method, [])
20
+ assert_passes do
21
+ assert_matcher_accepts have_received(method), mock
22
+ end
23
+ end
24
+
25
+ def test_fails_if_invocation_doesnt_exist
26
+ method = :a_method
27
+ mock = new_mock('a mock')
28
+ assert_fails do
29
+ assert_matcher_accepts have_received(method), mock
30
+ end
31
+ end
32
+
33
+ def test_fails_if_invocation_exists_with_different_arguments
34
+ method = :a_method
35
+ mock = new_mock('a mock')
36
+ Mockery.instance.invocation(mock, method, [2, 1])
37
+ assert_fails do
38
+ assert_matcher_accepts have_received(method).with(1, 2), mock
39
+ end
40
+ end
41
+
42
+ def test_passes_if_invocation_exists_with_wildcard_arguments
43
+ method = :a_method
44
+ mock = new_mock('a mock')
45
+ Mockery.instance.invocation(mock, method, ['hello'])
46
+ assert_passes do
47
+ assert_matcher_accepts have_received(method).with(is_a(String)), mock
48
+ end
49
+ end
50
+
51
+ def test_passes_if_invocation_exists_with_exact_arguments
52
+ method = :a_method
53
+ mock = new_mock('a mock')
54
+ Mockery.instance.invocation(mock, method, ['hello'])
55
+ assert_passes do
56
+ assert_matcher_accepts have_received(method).with('hello'), mock
57
+ end
58
+ end
59
+
60
+ def test_fails_if_invocation_exists_only_on_other_mock
61
+ method = :a_method
62
+ mock = new_mock('a mock')
63
+ other = 'another mock'
64
+ Mockery.instance.invocation(other, method, ['hello'])
65
+ assert_fails do
66
+ assert_matcher_accepts have_received(method), mock
67
+ end
68
+ end
69
+
70
+ def test_passes_if_invocation_exists_for_impersonating_mock
71
+ method = :a_method
72
+ object = Object.new
73
+ mock = new_mock('a mock')
74
+
75
+ class << object
76
+ attr_accessor :mocha
77
+ end
78
+ object.mocha = mock
79
+
80
+ Mockery.instance.invocation(mock, method, ['hello'])
81
+ assert_passes do
82
+ assert_matcher_accepts have_received(method).with('hello'), object
83
+ end
84
+ end
85
+
86
+ def test_passes_if_invocation_count_correct
87
+ method = :a_method
88
+ mock = new_mock('a mock')
89
+ 2.times { Mockery.instance.invocation(mock, method, []) }
90
+ assert_passes do
91
+ assert_matcher_accepts have_received(method).twice, mock
92
+ end
93
+ end
94
+
95
+ def test_fails_if_invocation_count_incorrect
96
+ method = :a_method
97
+ mock = new_mock('a mock')
98
+ Mockery.instance.invocation(mock, method, [])
99
+ assert_fails do
100
+ assert_matcher_accepts have_received(method).twice, mock
101
+ end
102
+ end
103
+
104
+ def test_fails_if_invocation_count_too_low
105
+ method = :a_method
106
+ mock = new_mock('a mock')
107
+ Mockery.instance.invocation(mock, method, [])
108
+ assert_fails do
109
+ assert_matcher_accepts have_received(method).twice, mock
110
+ end
111
+ end
112
+
113
+ def test_fails_if_invocation_count_too_high
114
+ method = :a_method
115
+ mock = new_mock('a mock')
116
+ 2.times { Mockery.instance.invocation(mock, method, []) }
117
+ assert_fails do
118
+ assert_matcher_accepts have_received(method).once, mock
119
+ end
120
+ end
121
+
122
+ def assert_passes(&block)
123
+ assert ! fails?(&block)
124
+ end
125
+
126
+ def assert_fails(&block)
127
+ assert fails?(&block)
128
+ end
129
+
130
+ def fails?
131
+ begin
132
+ yield
133
+ false
134
+ rescue Test::Unit::AssertionFailedError
135
+ true
136
+ end
137
+ end
138
+
139
+ end
140
+
141
+ class PartialHaveReceivedTest < Test::Unit::TestCase
142
+
143
+ include TestRunner
144
+ include Mocha::API
145
+ include HaveReceivedTestMethods
146
+
147
+ class FakeMock
148
+ def initialize(name)
149
+ @name = name
150
+ end
151
+
152
+ def inspect
153
+ @name
154
+ end
155
+
156
+ def mocha
157
+ self
158
+ end
159
+ end
160
+
161
+ def new_mock(*args)
162
+ FakeMock.new(*args)
163
+ end
164
+
165
+ end
166
+
167
+
168
+ class PureHaveReceivedTest < Test::Unit::TestCase
169
+
170
+ include TestRunner
171
+ include Mocha::API
172
+ include HaveReceivedTestMethods
173
+
174
+ class FakeMock
175
+ def initialize(name)
176
+ @name = name
177
+ end
178
+
179
+ def inspect
180
+ @name
181
+ end
182
+
183
+ def mocha
184
+ self
185
+ end
186
+ end
187
+
188
+ def new_mock(*args)
189
+ Mocha::Mock.new(*args)
190
+ end
191
+
192
+ end
@@ -0,0 +1,17 @@
1
+ require File.join(File.dirname(__FILE__), "..", "test_helper")
2
+ require 'bourne/invocation'
3
+
4
+ class InvocationTest < Test::Unit::TestCase
5
+
6
+ include Mocha
7
+
8
+ def test_has_mock_method_name_and_args
9
+ mock = 'a mock'
10
+ method = :call_me
11
+ args = [1, 2]
12
+ invocation = Invocation.new(mock, method, args)
13
+ assert_equal mock, invocation.mock
14
+ assert_equal method, invocation.method_name
15
+ assert_equal args, invocation.arguments
16
+ end
17
+ end
@@ -0,0 +1,329 @@
1
+ require File.expand_path('../../test_helper', __FILE__)
2
+ require 'bourne/mock'
3
+ require 'mocha/expectation_error'
4
+ require 'set'
5
+ require 'simple_counter'
6
+
7
+ class MockTest < Test::Unit::TestCase
8
+
9
+ include Mocha
10
+
11
+ def test_should_set_single_expectation
12
+ mock = Mock.new
13
+ mock.expects(:method1).returns(1)
14
+ assert_nothing_raised(ExpectationError) do
15
+ assert_equal 1, mock.method1
16
+ end
17
+ end
18
+
19
+ def test_should_build_and_store_expectations
20
+ mock = Mock.new
21
+ expectation = mock.expects(:method1)
22
+ assert_not_nil expectation
23
+ assert_equal [expectation], mock.expectations.to_a
24
+ end
25
+
26
+ def test_should_not_stub_everything_by_default
27
+ mock = Mock.new
28
+ assert_equal false, mock.everything_stubbed
29
+ end
30
+
31
+ def test_should_stub_everything
32
+ mock = Mock.new
33
+ mock.stub_everything
34
+ assert_equal true, mock.everything_stubbed
35
+ end
36
+
37
+ def test_should_be_able_to_extend_mock_object_with_module
38
+ mock = Mock.new
39
+ assert_nothing_raised(ExpectationError) { mock.extend(Module.new) }
40
+ end
41
+
42
+ def test_should_be_equal
43
+ mock = Mock.new
44
+ assert_equal true, mock.eql?(mock)
45
+ end
46
+
47
+ if RUBY_VERSION < '1.9'
48
+ OBJECT_METHODS = STANDARD_OBJECT_PUBLIC_INSTANCE_METHODS.reject { |m| m =~ /^__.*__$/ }
49
+ else
50
+ OBJECT_METHODS = STANDARD_OBJECT_PUBLIC_INSTANCE_METHODS.reject { |m| m =~ /^__.*__$/ || m == :object_id }
51
+ end
52
+
53
+ def test_should_be_able_to_mock_standard_object_methods
54
+ mock = Mock.new
55
+ OBJECT_METHODS.each { |method| mock.__expects__(method.to_sym).returns(method) }
56
+ OBJECT_METHODS.each { |method| assert_equal method, mock.__send__(method.to_sym) }
57
+ assert mock.__verified__?
58
+ end
59
+
60
+ def test_should_be_able_to_stub_standard_object_methods
61
+ mock = Mock.new
62
+ OBJECT_METHODS.each { |method| mock.__stubs__(method.to_sym).returns(method) }
63
+ OBJECT_METHODS.each { |method| assert_equal method, mock.__send__(method.to_sym) }
64
+ end
65
+
66
+ def test_should_create_and_add_expectations
67
+ mock = Mock.new
68
+ expectation1 = mock.expects(:method1)
69
+ expectation2 = mock.expects(:method2)
70
+ assert_equal [expectation1, expectation2].to_set, mock.expectations.to_set
71
+ end
72
+
73
+ def test_should_pass_backtrace_into_expectation
74
+ mock = Mock.new
75
+ backtrace = Object.new
76
+ expectation = mock.expects(:method1, backtrace)
77
+ assert_equal backtrace, expectation.backtrace
78
+ end
79
+
80
+ def test_should_pass_backtrace_into_stub
81
+ mock = Mock.new
82
+ backtrace = Object.new
83
+ stub = mock.stubs(:method1, backtrace)
84
+ assert_equal backtrace, stub.backtrace
85
+ end
86
+
87
+ def test_should_create_and_add_stubs
88
+ mock = Mock.new
89
+ stub1 = mock.stubs(:method1)
90
+ stub2 = mock.stubs(:method2)
91
+ assert_equal [stub1, stub2].to_set, mock.expectations.to_set
92
+ end
93
+
94
+ def test_should_invoke_expectation_and_return_result
95
+ mock = Mock.new
96
+ mock.expects(:my_method).returns(:result)
97
+ result = mock.my_method
98
+ assert_equal :result, result
99
+ end
100
+
101
+ def test_should_not_raise_error_if_stubbing_everything
102
+ mock = Mock.new
103
+ mock.stub_everything
104
+ result = nil
105
+ assert_nothing_raised(ExpectationError) do
106
+ result = mock.unexpected_method
107
+ end
108
+ assert_nil result
109
+ end
110
+
111
+ def test_should_raise_assertion_error_for_unexpected_method_call
112
+ mock = Mock.new
113
+ error = assert_raise(ExpectationError) do
114
+ mock.unexpected_method_called(:my_method, :argument1, :argument2)
115
+ end
116
+ assert_match(/unexpected invocation/, error.message)
117
+ assert_match(/my_method/, error.message)
118
+ assert_match(/argument1/, error.message)
119
+ assert_match(/argument2/, error.message)
120
+ end
121
+
122
+ def test_should_not_verify_successfully_because_not_all_expectations_have_been_satisfied
123
+ mock = Mock.new
124
+ mock.expects(:method1)
125
+ mock.expects(:method2)
126
+ mock.method1
127
+ assert !mock.__verified__?
128
+ end
129
+
130
+ def test_should_increment_assertion_counter_for_every_verified_expectation
131
+ mock = Mock.new
132
+
133
+ mock.expects(:method1)
134
+ mock.method1
135
+
136
+ mock.expects(:method2)
137
+ mock.method2
138
+
139
+ assertion_counter = SimpleCounter.new
140
+
141
+ mock.__verified__?(assertion_counter)
142
+
143
+ assert_equal 2, assertion_counter.count
144
+ end
145
+
146
+ def test_should_yield_supplied_parameters_to_block
147
+ mock = Mock.new
148
+ parameters_for_yield = [1, 2, 3]
149
+ mock.expects(:method1).yields(*parameters_for_yield)
150
+ yielded_parameters = nil
151
+ mock.method1() { |*parameters| yielded_parameters = parameters }
152
+ assert_equal parameters_for_yield, yielded_parameters
153
+ end
154
+
155
+ def test_should_set_up_multiple_expectations_with_return_values
156
+ mock = Mock.new
157
+ mock.expects(:method1 => :result1, :method2 => :result2)
158
+ assert_equal :result1, mock.method1
159
+ assert_equal :result2, mock.method2
160
+ end
161
+
162
+ def test_should_set_up_multiple_stubs_with_return_values
163
+ mock = Mock.new
164
+ mock.stubs(:method1 => :result1, :method2 => :result2)
165
+ assert_equal :result1, mock.method1
166
+ assert_equal :result2, mock.method2
167
+ end
168
+
169
+ def test_should_keep_returning_specified_value_for_stubs
170
+ mock = Mock.new
171
+ mock.stubs(:method1).returns(1)
172
+ assert_equal 1, mock.method1
173
+ assert_equal 1, mock.method1
174
+ end
175
+
176
+ def test_should_keep_returning_specified_value_for_expects
177
+ mock = Mock.new
178
+ mock.expects(:method1).times(2).returns(1)
179
+ assert_equal 1, mock.method1
180
+ assert_equal 1, mock.method1
181
+ end
182
+
183
+ def test_should_match_most_recent_call_to_expects
184
+ mock = Mock.new
185
+ mock.expects(:method1).returns(0)
186
+ mock.expects(:method1).returns(1)
187
+ assert_equal 1, mock.method1
188
+ end
189
+
190
+ def test_should_match_most_recent_call_to_stubs
191
+ mock = Mock.new
192
+ mock.stubs(:method1).returns(0)
193
+ mock.stubs(:method1).returns(1)
194
+ assert_equal 1, mock.method1
195
+ end
196
+
197
+ def test_should_match_most_recent_call_to_stubs_or_expects
198
+ mock = Mock.new
199
+ mock.stubs(:method1).returns(0)
200
+ mock.expects(:method1).returns(1)
201
+ assert_equal 1, mock.method1
202
+ end
203
+
204
+ def test_should_match_most_recent_call_to_expects_or_stubs
205
+ mock = Mock.new
206
+ mock.expects(:method1).returns(0)
207
+ mock.stubs(:method1).returns(1)
208
+ assert_equal 1, mock.method1
209
+ end
210
+
211
+ def test_should_respond_to_expected_method
212
+ mock = Mock.new
213
+ mock.expects(:method1)
214
+ assert_equal true, mock.respond_to?(:method1)
215
+ end
216
+
217
+ def test_should_not_respond_to_unexpected_method
218
+ mock = Mock.new
219
+ assert_equal false, mock.respond_to?(:method1)
220
+ end
221
+
222
+ def test_should_respond_to_methods_which_the_responder_does_responds_to
223
+ instance = Class.new do
224
+ define_method(:respond_to?) { |symbol| true }
225
+ end.new
226
+ mock = Mock.new
227
+ mock.responds_like(instance)
228
+ assert_equal true, mock.respond_to?(:invoked_method)
229
+ end
230
+
231
+ def test_should_not_respond_to_methods_which_the_responder_does_not_responds_to
232
+ instance = Class.new do
233
+ define_method(:respond_to?) { |symbol| false }
234
+ end.new
235
+ mock = Mock.new
236
+ mock.responds_like(instance)
237
+ assert_equal false, mock.respond_to?(:invoked_method)
238
+ end
239
+
240
+ def test_should_return_itself_to_allow_method_chaining
241
+ mock = Mock.new
242
+ assert_same mock.responds_like(Object.new), mock
243
+ end
244
+
245
+ def test_should_not_raise_no_method_error_if_mock_is_not_restricted_to_respond_like_a_responder
246
+ instance = Class.new do
247
+ define_method(:respond_to?) { true }
248
+ end.new
249
+ mock = Mock.new
250
+ mock.stubs(:invoked_method)
251
+ assert_nothing_raised(NoMethodError) { mock.invoked_method }
252
+ end
253
+
254
+ def test_should_not_raise_no_method_error_if_responder_does_respond_to_invoked_method
255
+ instance = Class.new do
256
+ define_method(:respond_to?) { |symbol| true }
257
+ end.new
258
+ mock = Mock.new
259
+ mock.responds_like(instance)
260
+ mock.stubs(:invoked_method)
261
+ assert_nothing_raised(NoMethodError) { mock.invoked_method }
262
+ end
263
+
264
+ def test_should_raise_no_method_error_if_responder_does_not_respond_to_invoked_method
265
+ instance = Class.new do
266
+ define_method(:respond_to?) { |symbol| false }
267
+ define_method(:mocha_inspect) { 'mocha_inspect' }
268
+ end.new
269
+ mock = Mock.new
270
+ mock.responds_like(instance)
271
+ mock.stubs(:invoked_method)
272
+ assert_raises(NoMethodError) { mock.invoked_method }
273
+ end
274
+
275
+ def test_should_raise_no_method_error_with_message_indicating_that_mock_is_constrained_to_respond_like_responder
276
+ instance = Class.new do
277
+ define_method(:respond_to?) { |symbol| false }
278
+ define_method(:mocha_inspect) { 'mocha_inspect' }
279
+ end.new
280
+ mock = Mock.new
281
+ mock.responds_like(instance)
282
+ mock.stubs(:invoked_method)
283
+ begin
284
+ mock.invoked_method
285
+ rescue NoMethodError => e
286
+ assert_match(/which responds like mocha_inspect/, e.message)
287
+ end
288
+ end
289
+
290
+ def test_should_handle_respond_to_with_private_methods_param_without_error
291
+ mock = Mock.new
292
+ assert_nothing_raised{ mock.respond_to?(:object_id, false) }
293
+ end
294
+
295
+ def test_should_respond_to_any_method_if_stubbing_everything
296
+ mock = Mock.new
297
+ mock.stub_everything
298
+ assert mock.respond_to?(:abc)
299
+ assert mock.respond_to?(:xyz)
300
+ end
301
+
302
+ class FakeExpectation
303
+ attr_reader :args
304
+
305
+ def invoke(args)
306
+ @args = args
307
+ end
308
+
309
+ def match?(*args)
310
+ true
311
+ end
312
+
313
+ def invocations_allowed?
314
+ true
315
+ end
316
+ end
317
+
318
+ def test_should_record_invocations
319
+ method = :a_method
320
+ args = [1, 2]
321
+ mock = Mock.new(method)
322
+ expectation = FakeExpectation.new
323
+ mock.expectations.add expectation
324
+ mock.send(method, *args)
325
+
326
+ assert_equal args, expectation.args
327
+ end
328
+
329
+ end