minitest 4.7.5 → 5.0.7
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/.autotest +21 -8
- data/History.txt +132 -12
- data/Manifest.txt +6 -0
- data/README.txt +109 -59
- data/Rakefile +3 -31
- data/design_rationale.rb +2 -2
- data/lib/hoe/minitest.rb +9 -5
- data/lib/minitest/assertions.rb +649 -0
- data/lib/minitest/autorun.rb +6 -6
- data/lib/minitest/benchmark.rb +92 -85
- data/lib/minitest/expectations.rb +281 -0
- data/lib/minitest/hell.rb +3 -5
- data/lib/minitest/mock.rb +40 -13
- data/lib/minitest/parallel_each.rb +59 -12
- data/lib/minitest/pride.rb +3 -111
- data/lib/minitest/pride_plugin.rb +143 -0
- data/lib/minitest/spec.rb +45 -312
- data/lib/minitest/test.rb +287 -0
- data/lib/minitest/unit.rb +32 -1402
- data/lib/minitest.rb +733 -0
- data/test/minitest/metametameta.rb +41 -30
- data/test/minitest/test_minitest_benchmark.rb +11 -9
- data/test/minitest/test_minitest_mock.rb +116 -32
- data/test/minitest/test_minitest_reporter.rb +313 -0
- data/test/minitest/test_minitest_spec.rb +52 -63
- data/test/minitest/test_minitest_unit.rb +231 -235
- data.tar.gz.sig +0 -0
- metadata +17 -10
- metadata.gz.sig +2 -1
data/lib/minitest/benchmark.rb
CHANGED
|
@@ -1,16 +1,32 @@
|
|
|
1
1
|
require 'minitest/unit'
|
|
2
2
|
require 'minitest/spec'
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
module Minitest
|
|
5
|
+
##
|
|
6
|
+
# Subclass Benchmark to create your own benchmark runs. Methods
|
|
7
|
+
# starting with "bench_" get executed on a per-class.
|
|
8
|
+
#
|
|
9
|
+
# See Minitest::Assertions
|
|
8
10
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
11
|
+
class Benchmark < Test
|
|
12
|
+
def self.io # :nodoc:
|
|
13
|
+
@io
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def io # :nodoc:
|
|
17
|
+
self.class.io
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def self.run reporter, options = {} # :nodoc:
|
|
21
|
+
# NOTE: this is truly horrible... but I don't see a way around this ATM.
|
|
22
|
+
@io = reporter.reporters.first.io
|
|
23
|
+
super
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def self.runnable_methods # :nodoc:
|
|
27
|
+
methods_matching(/^bench_/)
|
|
28
|
+
end
|
|
12
29
|
|
|
13
|
-
class TestCase
|
|
14
30
|
##
|
|
15
31
|
# Returns a set of ranges stepped exponentially from +min+ to
|
|
16
32
|
# +max+ by powers of +base+. Eg:
|
|
@@ -36,21 +52,6 @@ class MiniTest::Unit # :nodoc:
|
|
|
36
52
|
r = []; (min..max).step(step) { |n| r << n }; r
|
|
37
53
|
end
|
|
38
54
|
|
|
39
|
-
##
|
|
40
|
-
# Returns the benchmark methods (methods that start with bench_)
|
|
41
|
-
# for that class.
|
|
42
|
-
|
|
43
|
-
def self.benchmark_methods # :nodoc:
|
|
44
|
-
public_instance_methods(true).grep(/^bench_/).map { |m| m.to_s }.sort
|
|
45
|
-
end
|
|
46
|
-
|
|
47
|
-
##
|
|
48
|
-
# Returns all test suites that have benchmark methods.
|
|
49
|
-
|
|
50
|
-
def self.benchmark_suites
|
|
51
|
-
TestCase.test_suites.reject { |s| s.benchmark_methods.empty? }
|
|
52
|
-
end
|
|
53
|
-
|
|
54
55
|
##
|
|
55
56
|
# Specifies the ranges used for benchmarking for that class.
|
|
56
57
|
# Defaults to exponential growth from 1 to 10k by powers of 10.
|
|
@@ -83,7 +84,7 @@ class MiniTest::Unit # :nodoc:
|
|
|
83
84
|
def assert_performance validation, &work
|
|
84
85
|
range = self.class.bench_range
|
|
85
86
|
|
|
86
|
-
io.print "#{
|
|
87
|
+
io.print "#{self.name}"
|
|
87
88
|
|
|
88
89
|
times = []
|
|
89
90
|
|
|
@@ -341,76 +342,82 @@ class MiniTest::Unit # :nodoc:
|
|
|
341
342
|
end
|
|
342
343
|
end
|
|
343
344
|
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
# use this directly and is intended for those needing to write new
|
|
348
|
-
# performance curve fits (eg: you need a specific polynomial fit).
|
|
349
|
-
#
|
|
350
|
-
# See ::bench_performance_linear for an example of how to use this.
|
|
345
|
+
module Minitest
|
|
346
|
+
class BenchSpec < Benchmark
|
|
347
|
+
extend Minitest::Spec::DSL
|
|
351
348
|
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
349
|
+
##
|
|
350
|
+
# This is used to define a new benchmark method. You usually don't
|
|
351
|
+
# use this directly and is intended for those needing to write new
|
|
352
|
+
# performance curve fits (eg: you need a specific polynomial fit).
|
|
353
|
+
#
|
|
354
|
+
# See ::bench_performance_linear for an example of how to use this.
|
|
355
355
|
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
356
|
+
def self.bench name, &block
|
|
357
|
+
define_method "bench_#{name.gsub(/\W+/, '_')}", &block
|
|
358
|
+
end
|
|
359
|
+
|
|
360
|
+
##
|
|
361
|
+
# Specifies the ranges used for benchmarking for that class.
|
|
362
|
+
#
|
|
363
|
+
# bench_range do
|
|
364
|
+
# bench_exp(2, 16, 2)
|
|
365
|
+
# end
|
|
366
|
+
#
|
|
367
|
+
# See Minitest::Benchmark#bench_range for more details.
|
|
364
368
|
|
|
365
|
-
|
|
366
|
-
|
|
369
|
+
def self.bench_range &block
|
|
370
|
+
return super unless block
|
|
367
371
|
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
372
|
+
meta = (class << self; self; end)
|
|
373
|
+
meta.send :define_method, "bench_range", &block
|
|
374
|
+
end
|
|
371
375
|
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
376
|
+
##
|
|
377
|
+
# Create a benchmark that verifies that the performance is linear.
|
|
378
|
+
#
|
|
379
|
+
# describe "my class" do
|
|
380
|
+
# bench_performance_linear "fast_algorithm", 0.9999 do |n|
|
|
381
|
+
# @obj.fast_algorithm(n)
|
|
382
|
+
# end
|
|
383
|
+
# end
|
|
384
|
+
|
|
385
|
+
def self.bench_performance_linear name, threshold = 0.99, &work
|
|
386
|
+
bench name do
|
|
387
|
+
assert_performance_linear threshold, &work
|
|
388
|
+
end
|
|
384
389
|
end
|
|
385
|
-
end
|
|
386
390
|
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
391
|
+
##
|
|
392
|
+
# Create a benchmark that verifies that the performance is constant.
|
|
393
|
+
#
|
|
394
|
+
# describe "my class" do
|
|
395
|
+
# bench_performance_constant "zoom_algorithm!" do |n|
|
|
396
|
+
# @obj.zoom_algorithm!(n)
|
|
397
|
+
# end
|
|
398
|
+
# end
|
|
399
|
+
|
|
400
|
+
def self.bench_performance_constant name, threshold = 0.99, &work
|
|
401
|
+
bench name do
|
|
402
|
+
assert_performance_constant threshold, &work
|
|
403
|
+
end
|
|
399
404
|
end
|
|
400
|
-
end
|
|
401
405
|
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
406
|
+
##
|
|
407
|
+
# Create a benchmark that verifies that the performance is exponential.
|
|
408
|
+
#
|
|
409
|
+
# describe "my class" do
|
|
410
|
+
# bench_performance_exponential "algorithm" do |n|
|
|
411
|
+
# @obj.algorithm(n)
|
|
412
|
+
# end
|
|
413
|
+
# end
|
|
414
|
+
|
|
415
|
+
def self.bench_performance_exponential name, threshold = 0.99, &work
|
|
416
|
+
bench name do
|
|
417
|
+
assert_performance_exponential threshold, &work
|
|
418
|
+
end
|
|
414
419
|
end
|
|
415
420
|
end
|
|
421
|
+
|
|
422
|
+
Minitest::Spec.register_spec_type(/Bench(mark)?$/, Minitest::BenchSpec)
|
|
416
423
|
end
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
##
|
|
2
|
+
# It's where you hide your "assertions".
|
|
3
|
+
#
|
|
4
|
+
# Please note, because of the way that expectations are implemented,
|
|
5
|
+
# all expectations (eg must_equal) are dependent upon a thread local
|
|
6
|
+
# variable +:current_spec+. If your specs rely on mixing threads into
|
|
7
|
+
# the specs themselves, you're better off using assertions. For
|
|
8
|
+
# example:
|
|
9
|
+
#
|
|
10
|
+
# it "should still work in threads" do
|
|
11
|
+
# my_threaded_thingy do
|
|
12
|
+
# (1+1).must_equal 2 # bad
|
|
13
|
+
# assert_equal 2, 1+1 # good
|
|
14
|
+
# end
|
|
15
|
+
# end
|
|
16
|
+
|
|
17
|
+
module Minitest::Expectations
|
|
18
|
+
##
|
|
19
|
+
# See Minitest::Assertions#assert_empty.
|
|
20
|
+
#
|
|
21
|
+
# collection.must_be_empty
|
|
22
|
+
#
|
|
23
|
+
# :method: must_be_empty
|
|
24
|
+
|
|
25
|
+
infect_an_assertion :assert_empty, :must_be_empty, :unary
|
|
26
|
+
|
|
27
|
+
##
|
|
28
|
+
# See Minitest::Assertions#assert_equal
|
|
29
|
+
#
|
|
30
|
+
# a.must_equal b
|
|
31
|
+
#
|
|
32
|
+
# :method: must_equal
|
|
33
|
+
|
|
34
|
+
infect_an_assertion :assert_equal, :must_equal
|
|
35
|
+
|
|
36
|
+
##
|
|
37
|
+
# See Minitest::Assertions#assert_in_delta
|
|
38
|
+
#
|
|
39
|
+
# n.must_be_close_to m [, delta]
|
|
40
|
+
#
|
|
41
|
+
# :method: must_be_close_to
|
|
42
|
+
|
|
43
|
+
infect_an_assertion :assert_in_delta, :must_be_close_to
|
|
44
|
+
|
|
45
|
+
alias :must_be_within_delta :must_be_close_to # :nodoc:
|
|
46
|
+
|
|
47
|
+
##
|
|
48
|
+
# See Minitest::Assertions#assert_in_epsilon
|
|
49
|
+
#
|
|
50
|
+
# n.must_be_within_epsilon m [, epsilon]
|
|
51
|
+
#
|
|
52
|
+
# :method: must_be_within_epsilon
|
|
53
|
+
|
|
54
|
+
infect_an_assertion :assert_in_epsilon, :must_be_within_epsilon
|
|
55
|
+
|
|
56
|
+
##
|
|
57
|
+
# See Minitest::Assertions#assert_includes
|
|
58
|
+
#
|
|
59
|
+
# collection.must_include obj
|
|
60
|
+
#
|
|
61
|
+
# :method: must_include
|
|
62
|
+
|
|
63
|
+
infect_an_assertion :assert_includes, :must_include, :reverse
|
|
64
|
+
|
|
65
|
+
##
|
|
66
|
+
# See Minitest::Assertions#assert_instance_of
|
|
67
|
+
#
|
|
68
|
+
# obj.must_be_instance_of klass
|
|
69
|
+
#
|
|
70
|
+
# :method: must_be_instance_of
|
|
71
|
+
|
|
72
|
+
infect_an_assertion :assert_instance_of, :must_be_instance_of
|
|
73
|
+
|
|
74
|
+
##
|
|
75
|
+
# See Minitest::Assertions#assert_kind_of
|
|
76
|
+
#
|
|
77
|
+
# obj.must_be_kind_of mod
|
|
78
|
+
#
|
|
79
|
+
# :method: must_be_kind_of
|
|
80
|
+
|
|
81
|
+
infect_an_assertion :assert_kind_of, :must_be_kind_of
|
|
82
|
+
|
|
83
|
+
##
|
|
84
|
+
# See Minitest::Assertions#assert_match
|
|
85
|
+
#
|
|
86
|
+
# a.must_match b
|
|
87
|
+
#
|
|
88
|
+
# :method: must_match
|
|
89
|
+
|
|
90
|
+
infect_an_assertion :assert_match, :must_match
|
|
91
|
+
|
|
92
|
+
##
|
|
93
|
+
# See Minitest::Assertions#assert_nil
|
|
94
|
+
#
|
|
95
|
+
# obj.must_be_nil
|
|
96
|
+
#
|
|
97
|
+
# :method: must_be_nil
|
|
98
|
+
|
|
99
|
+
infect_an_assertion :assert_nil, :must_be_nil, :unary
|
|
100
|
+
|
|
101
|
+
##
|
|
102
|
+
# See Minitest::Assertions#assert_operator
|
|
103
|
+
#
|
|
104
|
+
# n.must_be :<=, 42
|
|
105
|
+
#
|
|
106
|
+
# This can also do predicates:
|
|
107
|
+
#
|
|
108
|
+
# str.must_be :empty?
|
|
109
|
+
#
|
|
110
|
+
# :method: must_be
|
|
111
|
+
|
|
112
|
+
infect_an_assertion :assert_operator, :must_be, :reverse
|
|
113
|
+
|
|
114
|
+
##
|
|
115
|
+
# See Minitest::Assertions#assert_output
|
|
116
|
+
#
|
|
117
|
+
# proc { ... }.must_output out_or_nil [, err]
|
|
118
|
+
#
|
|
119
|
+
# :method: must_output
|
|
120
|
+
|
|
121
|
+
infect_an_assertion :assert_output, :must_output
|
|
122
|
+
|
|
123
|
+
##
|
|
124
|
+
# See Minitest::Assertions#assert_raises
|
|
125
|
+
#
|
|
126
|
+
# proc { ... }.must_raise exception
|
|
127
|
+
#
|
|
128
|
+
# :method: must_raise
|
|
129
|
+
|
|
130
|
+
infect_an_assertion :assert_raises, :must_raise
|
|
131
|
+
|
|
132
|
+
##
|
|
133
|
+
# See Minitest::Assertions#assert_respond_to
|
|
134
|
+
#
|
|
135
|
+
# obj.must_respond_to msg
|
|
136
|
+
#
|
|
137
|
+
# :method: must_respond_to
|
|
138
|
+
|
|
139
|
+
infect_an_assertion :assert_respond_to, :must_respond_to, :reverse
|
|
140
|
+
|
|
141
|
+
##
|
|
142
|
+
# See Minitest::Assertions#assert_same
|
|
143
|
+
#
|
|
144
|
+
# a.must_be_same_as b
|
|
145
|
+
#
|
|
146
|
+
# :method: must_be_same_as
|
|
147
|
+
|
|
148
|
+
infect_an_assertion :assert_same, :must_be_same_as
|
|
149
|
+
|
|
150
|
+
##
|
|
151
|
+
# See Minitest::Assertions#assert_silent
|
|
152
|
+
#
|
|
153
|
+
# proc { ... }.must_be_silent
|
|
154
|
+
#
|
|
155
|
+
# :method: must_be_silent
|
|
156
|
+
|
|
157
|
+
infect_an_assertion :assert_silent, :must_be_silent
|
|
158
|
+
|
|
159
|
+
##
|
|
160
|
+
# See Minitest::Assertions#assert_throws
|
|
161
|
+
#
|
|
162
|
+
# proc { ... }.must_throw sym
|
|
163
|
+
#
|
|
164
|
+
# :method: must_throw
|
|
165
|
+
|
|
166
|
+
infect_an_assertion :assert_throws, :must_throw
|
|
167
|
+
|
|
168
|
+
##
|
|
169
|
+
# See Minitest::Assertions#refute_empty
|
|
170
|
+
#
|
|
171
|
+
# collection.wont_be_empty
|
|
172
|
+
#
|
|
173
|
+
# :method: wont_be_empty
|
|
174
|
+
|
|
175
|
+
infect_an_assertion :refute_empty, :wont_be_empty, :unary
|
|
176
|
+
|
|
177
|
+
##
|
|
178
|
+
# See Minitest::Assertions#refute_equal
|
|
179
|
+
#
|
|
180
|
+
# a.wont_equal b
|
|
181
|
+
#
|
|
182
|
+
# :method: wont_equal
|
|
183
|
+
|
|
184
|
+
infect_an_assertion :refute_equal, :wont_equal
|
|
185
|
+
|
|
186
|
+
##
|
|
187
|
+
# See Minitest::Assertions#refute_in_delta
|
|
188
|
+
#
|
|
189
|
+
# n.wont_be_close_to m [, delta]
|
|
190
|
+
#
|
|
191
|
+
# :method: wont_be_close_to
|
|
192
|
+
|
|
193
|
+
infect_an_assertion :refute_in_delta, :wont_be_close_to
|
|
194
|
+
|
|
195
|
+
alias :wont_be_within_delta :wont_be_close_to # :nodoc:
|
|
196
|
+
|
|
197
|
+
##
|
|
198
|
+
# See Minitest::Assertions#refute_in_epsilon
|
|
199
|
+
#
|
|
200
|
+
# n.wont_be_within_epsilon m [, epsilon]
|
|
201
|
+
#
|
|
202
|
+
# :method: wont_be_within_epsilon
|
|
203
|
+
|
|
204
|
+
infect_an_assertion :refute_in_epsilon, :wont_be_within_epsilon
|
|
205
|
+
|
|
206
|
+
##
|
|
207
|
+
# See Minitest::Assertions#refute_includes
|
|
208
|
+
#
|
|
209
|
+
# collection.wont_include obj
|
|
210
|
+
#
|
|
211
|
+
# :method: wont_include
|
|
212
|
+
|
|
213
|
+
infect_an_assertion :refute_includes, :wont_include, :reverse
|
|
214
|
+
|
|
215
|
+
##
|
|
216
|
+
# See Minitest::Assertions#refute_instance_of
|
|
217
|
+
#
|
|
218
|
+
# obj.wont_be_instance_of klass
|
|
219
|
+
#
|
|
220
|
+
# :method: wont_be_instance_of
|
|
221
|
+
|
|
222
|
+
infect_an_assertion :refute_instance_of, :wont_be_instance_of
|
|
223
|
+
|
|
224
|
+
##
|
|
225
|
+
# See Minitest::Assertions#refute_kind_of
|
|
226
|
+
#
|
|
227
|
+
# obj.wont_be_kind_of mod
|
|
228
|
+
#
|
|
229
|
+
# :method: wont_be_kind_of
|
|
230
|
+
|
|
231
|
+
infect_an_assertion :refute_kind_of, :wont_be_kind_of
|
|
232
|
+
|
|
233
|
+
##
|
|
234
|
+
# See Minitest::Assertions#refute_match
|
|
235
|
+
#
|
|
236
|
+
# a.wont_match b
|
|
237
|
+
#
|
|
238
|
+
# :method: wont_match
|
|
239
|
+
|
|
240
|
+
infect_an_assertion :refute_match, :wont_match
|
|
241
|
+
|
|
242
|
+
##
|
|
243
|
+
# See Minitest::Assertions#refute_nil
|
|
244
|
+
#
|
|
245
|
+
# obj.wont_be_nil
|
|
246
|
+
#
|
|
247
|
+
# :method: wont_be_nil
|
|
248
|
+
|
|
249
|
+
infect_an_assertion :refute_nil, :wont_be_nil, :unary
|
|
250
|
+
|
|
251
|
+
##
|
|
252
|
+
# See Minitest::Assertions#refute_operator
|
|
253
|
+
#
|
|
254
|
+
# n.wont_be :<=, 42
|
|
255
|
+
#
|
|
256
|
+
# This can also do predicates:
|
|
257
|
+
#
|
|
258
|
+
# str.wont_be :empty?
|
|
259
|
+
#
|
|
260
|
+
# :method: wont_be
|
|
261
|
+
|
|
262
|
+
infect_an_assertion :refute_operator, :wont_be, :reverse
|
|
263
|
+
|
|
264
|
+
##
|
|
265
|
+
# See Minitest::Assertions#refute_respond_to
|
|
266
|
+
#
|
|
267
|
+
# obj.wont_respond_to msg
|
|
268
|
+
#
|
|
269
|
+
# :method: wont_respond_to
|
|
270
|
+
|
|
271
|
+
infect_an_assertion :refute_respond_to, :wont_respond_to, :reverse
|
|
272
|
+
|
|
273
|
+
##
|
|
274
|
+
# See Minitest::Assertions#refute_same
|
|
275
|
+
#
|
|
276
|
+
# a.wont_be_same_as b
|
|
277
|
+
#
|
|
278
|
+
# :method: wont_be_same_as
|
|
279
|
+
|
|
280
|
+
infect_an_assertion :refute_same, :wont_be_same_as
|
|
281
|
+
end
|
data/lib/minitest/hell.rb
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
require "minitest/parallel_each"
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
class Minitest::Unit::TestCase
|
|
3
|
+
class Minitest::Test
|
|
5
4
|
class << self
|
|
6
|
-
alias :old_test_order :test_order
|
|
5
|
+
alias :old_test_order :test_order # :nodoc:
|
|
7
6
|
|
|
8
|
-
def test_order
|
|
7
|
+
def test_order # :nodoc:
|
|
9
8
|
:parallel
|
|
10
9
|
end
|
|
11
10
|
end
|
|
12
11
|
end
|
|
13
|
-
# :startdoc:
|
data/lib/minitest/mock.rb
CHANGED
|
@@ -1,20 +1,37 @@
|
|
|
1
1
|
class MockExpectationError < StandardError; end # :nodoc:
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
# A simple and clean mock object framework.
|
|
5
|
-
|
|
6
|
-
module MiniTest # :nodoc:
|
|
3
|
+
module Minitest # :nodoc:
|
|
7
4
|
|
|
8
5
|
##
|
|
6
|
+
# A simple and clean mock object framework.
|
|
7
|
+
#
|
|
9
8
|
# All mock objects are an instance of Mock
|
|
10
9
|
|
|
11
10
|
class Mock
|
|
12
11
|
alias :__respond_to? :respond_to?
|
|
13
12
|
|
|
14
|
-
|
|
13
|
+
overridden_methods = %w(
|
|
14
|
+
===
|
|
15
|
+
inspect
|
|
16
|
+
object_id
|
|
17
|
+
public_send
|
|
18
|
+
respond_to_missing?
|
|
19
|
+
send
|
|
20
|
+
to_s
|
|
21
|
+
)
|
|
15
22
|
|
|
16
23
|
instance_methods.each do |m|
|
|
17
|
-
undef_method m unless
|
|
24
|
+
undef_method m unless overridden_methods.include?(m.to_s) || m =~ /^__/
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
overridden_methods.map(&:to_sym).each do |method_id|
|
|
28
|
+
define_method method_id do |*args, &b|
|
|
29
|
+
if @expected_calls.has_key? method_id then
|
|
30
|
+
method_missing(method_id, *args, &b)
|
|
31
|
+
else
|
|
32
|
+
super(*args, &b)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
18
35
|
end
|
|
19
36
|
|
|
20
37
|
def initialize # :nodoc:
|
|
@@ -43,11 +60,13 @@ module MiniTest # :nodoc:
|
|
|
43
60
|
# @mock.uses_any_string("foo") # => true
|
|
44
61
|
# @mock.verify # => true
|
|
45
62
|
#
|
|
46
|
-
# @mock.expect(:uses_one_string, true, ["foo"]
|
|
63
|
+
# @mock.expect(:uses_one_string, true, ["foo"])
|
|
47
64
|
# @mock.uses_one_string("bar") # => true
|
|
48
65
|
# @mock.verify # => raises MockExpectationError
|
|
49
66
|
|
|
50
67
|
def expect(name, retval, args=[], &blk)
|
|
68
|
+
name = name.to_sym
|
|
69
|
+
|
|
51
70
|
if block_given?
|
|
52
71
|
raise ArgumentError, "args ignored when block given" unless args.empty?
|
|
53
72
|
@expected_calls[name] << { :retval => retval, :block => blk }
|
|
@@ -139,7 +158,7 @@ module MiniTest # :nodoc:
|
|
|
139
158
|
end
|
|
140
159
|
|
|
141
160
|
def respond_to?(sym, include_private = false) # :nodoc:
|
|
142
|
-
return true if @expected_calls.has_key?
|
|
161
|
+
return true if @expected_calls.has_key? sym.to_sym
|
|
143
162
|
return __respond_to?(sym, include_private)
|
|
144
163
|
end
|
|
145
164
|
end
|
|
@@ -151,8 +170,9 @@ class Object # :nodoc:
|
|
|
151
170
|
# Add a temporary stubbed method replacing +name+ for the duration
|
|
152
171
|
# of the +block+. If +val_or_callable+ responds to #call, then it
|
|
153
172
|
# returns the result of calling it, otherwise returns the value
|
|
154
|
-
# as-is.
|
|
155
|
-
#
|
|
173
|
+
# as-is. If stubbed method yields a block, +block_args+ will be
|
|
174
|
+
# passed along. Cleans up the stub at the end of the +block+. The
|
|
175
|
+
# method +name+ must exist before stubbing.
|
|
156
176
|
#
|
|
157
177
|
# def test_stale_eh
|
|
158
178
|
# obj_under_test = Something.new
|
|
@@ -162,8 +182,9 @@ class Object # :nodoc:
|
|
|
162
182
|
# assert obj_under_test.stale?
|
|
163
183
|
# end
|
|
164
184
|
# end
|
|
185
|
+
#
|
|
165
186
|
|
|
166
|
-
def stub name, val_or_callable, &block
|
|
187
|
+
def stub name, val_or_callable, *block_args, &block
|
|
167
188
|
new_name = "__minitest_stub__#{name}"
|
|
168
189
|
|
|
169
190
|
metaclass = class << self; self; end
|
|
@@ -176,12 +197,17 @@ class Object # :nodoc:
|
|
|
176
197
|
|
|
177
198
|
metaclass.send :alias_method, new_name, name
|
|
178
199
|
|
|
179
|
-
metaclass.send :define_method, name do |*args|
|
|
180
|
-
|
|
200
|
+
metaclass.send :define_method, name do |*args, &blk|
|
|
201
|
+
|
|
202
|
+
ret = if val_or_callable.respond_to? :call then
|
|
181
203
|
val_or_callable.call(*args)
|
|
182
204
|
else
|
|
183
205
|
val_or_callable
|
|
184
206
|
end
|
|
207
|
+
|
|
208
|
+
blk.call(*block_args) if blk
|
|
209
|
+
|
|
210
|
+
ret
|
|
185
211
|
end
|
|
186
212
|
|
|
187
213
|
yield self
|
|
@@ -190,4 +216,5 @@ class Object # :nodoc:
|
|
|
190
216
|
metaclass.send :alias_method, name, new_name
|
|
191
217
|
metaclass.send :undef_method, new_name
|
|
192
218
|
end
|
|
219
|
+
|
|
193
220
|
end
|