test-unit 3.2.0 → 3.3.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/COPYING +4 -1
- data/README.md +11 -11
- data/Rakefile +10 -1
- data/doc/text/getting-started.md +246 -0
- data/doc/text/news.md +372 -1
- data/lib/test/unit.rb +171 -157
- data/lib/test/unit/assertions.rb +187 -149
- data/lib/test/unit/attribute.rb +71 -2
- data/lib/test/unit/autorunner.rb +65 -32
- data/lib/test/unit/code-snippet-fetcher.rb +7 -7
- data/lib/test/unit/collector/load.rb +8 -13
- data/lib/test/unit/data-sets.rb +116 -0
- data/lib/test/unit/data.rb +121 -12
- data/lib/test/unit/diff.rb +11 -11
- data/lib/test/unit/fixture.rb +3 -0
- data/lib/test/unit/notification.rb +9 -7
- data/lib/test/unit/omission.rb +34 -31
- data/lib/test/unit/pending.rb +12 -11
- data/lib/test/unit/priority.rb +7 -3
- data/lib/test/unit/runner/console.rb +25 -0
- data/lib/test/unit/test-suite-creator.rb +22 -8
- data/lib/test/unit/testcase.rb +270 -182
- data/lib/test/unit/ui/console/testrunner.rb +90 -35
- data/lib/test/unit/ui/emacs/testrunner.rb +5 -5
- data/lib/test/unit/util/observable.rb +2 -2
- data/lib/test/unit/util/output.rb +5 -4
- data/lib/test/unit/util/procwrapper.rb +4 -4
- data/lib/test/unit/version.rb +1 -1
- data/test/collector/test-descendant.rb +4 -0
- data/test/collector/test-load.rb +35 -2
- data/test/collector/test_dir.rb +5 -4
- data/test/collector/test_objectspace.rb +7 -5
- data/test/test-assertions.rb +128 -101
- data/test/test-code-snippet.rb +42 -0
- data/test/test-data.rb +195 -79
- data/test/test-priority.rb +19 -8
- data/test/test-test-case.rb +111 -3
- data/test/test-test-suite.rb +1 -0
- data/test/testunit-test-util.rb +2 -0
- metadata +38 -37
@@ -5,6 +5,8 @@
|
|
5
5
|
# * Copyright (c) 2011 Kouhei Sutou <tt><kou@clear-code.com></tt>
|
6
6
|
# License:: Ruby license.
|
7
7
|
|
8
|
+
require "test/unit/data-sets"
|
9
|
+
|
8
10
|
module Test
|
9
11
|
module Unit
|
10
12
|
class TestSuiteCreator # :nodoc:
|
@@ -22,15 +24,11 @@ module Test
|
|
22
24
|
def create
|
23
25
|
suite = TestSuite.new(@test_case.name, @test_case)
|
24
26
|
collect_test_names.each do |test_name|
|
25
|
-
data_sets =
|
26
|
-
:recursive => false)
|
27
|
+
data_sets = extract_data_sets(test_name)
|
27
28
|
if data_sets
|
28
|
-
data_sets.each do |
|
29
|
-
|
30
|
-
|
31
|
-
append_test(suite, test_name) do |test|
|
32
|
-
test.assign_test_data(label, data)
|
33
|
-
end
|
29
|
+
data_sets.each do |label, data|
|
30
|
+
append_test(suite, test_name) do |test|
|
31
|
+
test.assign_test_data(label, data)
|
34
32
|
end
|
35
33
|
end
|
36
34
|
else
|
@@ -42,6 +40,22 @@ module Test
|
|
42
40
|
end
|
43
41
|
|
44
42
|
private
|
43
|
+
def extract_data_sets(test_name)
|
44
|
+
data_sets = @test_case.find_attribute(test_name,
|
45
|
+
:data,
|
46
|
+
:recursive => false)
|
47
|
+
data_method_name = "data_#{test_name}"
|
48
|
+
test = @test_case.new(test_name)
|
49
|
+
if test.respond_to?(data_method_name)
|
50
|
+
data_method = test.method(data_method_name)
|
51
|
+
if data_method.arity <= 0
|
52
|
+
data_sets ||= DataSets.new
|
53
|
+
data_sets << data_method
|
54
|
+
end
|
55
|
+
end
|
56
|
+
data_sets
|
57
|
+
end
|
58
|
+
|
45
59
|
def append_test(suite, test_name)
|
46
60
|
test = @test_case.new(test_name)
|
47
61
|
yield(test) if block_given?
|
data/lib/test/unit/testcase.rb
CHANGED
@@ -37,49 +37,70 @@ module Test
|
|
37
37
|
# You can run two hooks before/after a TestCase run.
|
38
38
|
#
|
39
39
|
# Example:
|
40
|
-
#
|
41
|
-
# class
|
42
|
-
#
|
40
|
+
#
|
41
|
+
# class TestMyClass < Test::Unit::TestCase
|
42
|
+
# class << self
|
43
|
+
# def startup
|
44
|
+
# ...
|
45
|
+
# end
|
46
|
+
#
|
47
|
+
# def shutdown
|
48
|
+
# ...
|
49
|
+
# end
|
50
|
+
# end
|
51
|
+
#
|
52
|
+
# def setup
|
43
53
|
# ...
|
44
54
|
# end
|
45
55
|
#
|
46
|
-
# def
|
56
|
+
# def cleanup
|
47
57
|
# ...
|
48
58
|
# end
|
49
|
-
# end
|
50
59
|
#
|
51
|
-
#
|
52
|
-
#
|
53
|
-
#
|
60
|
+
# def teardown
|
61
|
+
# ...
|
62
|
+
# end
|
54
63
|
#
|
55
|
-
#
|
56
|
-
#
|
57
|
-
#
|
64
|
+
# def test_my_method1
|
65
|
+
# ...
|
66
|
+
# end
|
58
67
|
#
|
59
|
-
#
|
60
|
-
#
|
68
|
+
# def test_my_method2
|
69
|
+
# ...
|
70
|
+
# end
|
61
71
|
# end
|
62
72
|
#
|
63
|
-
#
|
64
|
-
# ...
|
65
|
-
# end
|
73
|
+
# Here is a call order:
|
66
74
|
#
|
67
|
-
#
|
68
|
-
#
|
69
|
-
#
|
70
|
-
#
|
75
|
+
# 1. startup
|
76
|
+
# 1. setup
|
77
|
+
# 1. test_my_method1
|
78
|
+
# 1. cleanup
|
79
|
+
# 1. teardown
|
80
|
+
# 1. setup
|
81
|
+
# 1. test_my_method2
|
82
|
+
# 1. cleanup
|
83
|
+
# 1. teardown
|
84
|
+
# 1. shutdown
|
71
85
|
#
|
72
|
-
#
|
73
|
-
#
|
74
|
-
#
|
75
|
-
#
|
76
|
-
#
|
77
|
-
#
|
78
|
-
#
|
79
|
-
#
|
80
|
-
#
|
81
|
-
#
|
82
|
-
#
|
86
|
+
# You can set an attribute to each test.
|
87
|
+
#
|
88
|
+
# Example:
|
89
|
+
#
|
90
|
+
# class TestMyClass < Test::Unit::TestCase
|
91
|
+
# attribute :speed, :fast
|
92
|
+
# def test_my_fast_method
|
93
|
+
# # You can get the attribute via `self[]`
|
94
|
+
# self[:speed] # => :fast
|
95
|
+
# ...
|
96
|
+
# end
|
97
|
+
#
|
98
|
+
# attribute :speed, :slow
|
99
|
+
# def test_my_slow_method
|
100
|
+
# self[:speed] # => :slow
|
101
|
+
# ...
|
102
|
+
# end
|
103
|
+
# end
|
83
104
|
class TestCase
|
84
105
|
include Attribute
|
85
106
|
include Fixture
|
@@ -109,6 +130,15 @@ module Test
|
|
109
130
|
super
|
110
131
|
end
|
111
132
|
|
133
|
+
def include(*modules, &block) # :nodoc:
|
134
|
+
super
|
135
|
+
modules.each do |mod|
|
136
|
+
mod.public_instance_methods(false).each do |method_name|
|
137
|
+
AutoRunnerLoader.check(self, method_name.to_s)
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
112
142
|
@@added_method_names = {}
|
113
143
|
def method_added(name) # :nodoc:
|
114
144
|
super
|
@@ -129,11 +159,12 @@ module Test
|
|
129
159
|
path, line, = caller[0].split(/:(\d+)/, 2)
|
130
160
|
line = line.to_i if line
|
131
161
|
end
|
132
|
-
|
162
|
+
location = {
|
133
163
|
:method_name => stringified_name,
|
134
164
|
:path => File.expand_path(path),
|
135
165
|
:line => line,
|
136
166
|
}
|
167
|
+
add_method_location(location)
|
137
168
|
added_method_names[stringified_name] = true
|
138
169
|
AutoRunnerLoader.check(self, stringified_name)
|
139
170
|
end
|
@@ -155,27 +186,29 @@ module Test
|
|
155
186
|
# scope.
|
156
187
|
#
|
157
188
|
# Here is an example test case:
|
158
|
-
#
|
159
|
-
# class
|
160
|
-
#
|
161
|
-
#
|
189
|
+
#
|
190
|
+
# class TestMyClass < Test::Unit::TestCase
|
191
|
+
# class << self
|
192
|
+
# def startup
|
193
|
+
# ...
|
194
|
+
# end
|
162
195
|
# end
|
163
|
-
# end
|
164
196
|
#
|
165
|
-
#
|
166
|
-
#
|
167
|
-
#
|
197
|
+
# def setup
|
198
|
+
# ...
|
199
|
+
# end
|
168
200
|
#
|
169
|
-
#
|
170
|
-
#
|
171
|
-
#
|
201
|
+
# def test_my_class1
|
202
|
+
# ...
|
203
|
+
# end
|
172
204
|
#
|
173
|
-
#
|
174
|
-
#
|
205
|
+
# def test_my_class2
|
206
|
+
# ...
|
207
|
+
# end
|
175
208
|
# end
|
176
|
-
# end
|
177
209
|
#
|
178
210
|
# Here is a call order:
|
211
|
+
#
|
179
212
|
# * startup
|
180
213
|
# * setup
|
181
214
|
# * test_my_class1 (or test_my_class2)
|
@@ -191,27 +224,29 @@ module Test
|
|
191
224
|
# down fixture information used in test case scope.
|
192
225
|
#
|
193
226
|
# Here is an example test case:
|
194
|
-
#
|
195
|
-
# class
|
196
|
-
#
|
197
|
-
#
|
227
|
+
#
|
228
|
+
# class TestMyClass < Test::Unit::TestCase
|
229
|
+
# class << self
|
230
|
+
# def shutdown
|
231
|
+
# ...
|
232
|
+
# end
|
198
233
|
# end
|
199
|
-
# end
|
200
234
|
#
|
201
|
-
#
|
202
|
-
#
|
203
|
-
#
|
235
|
+
# def teardown
|
236
|
+
# ...
|
237
|
+
# end
|
204
238
|
#
|
205
|
-
#
|
206
|
-
#
|
207
|
-
#
|
239
|
+
# def test_my_class1
|
240
|
+
# ...
|
241
|
+
# end
|
208
242
|
#
|
209
|
-
#
|
210
|
-
#
|
243
|
+
# def test_my_class2
|
244
|
+
# ...
|
245
|
+
# end
|
211
246
|
# end
|
212
|
-
# end
|
213
247
|
#
|
214
248
|
# Here is a call order:
|
249
|
+
#
|
215
250
|
# * test_my_class1 (or test_my_class2)
|
216
251
|
# * teardown
|
217
252
|
# * test_my_class2 (or test_my_class1)
|
@@ -226,20 +261,27 @@ module Test
|
|
226
261
|
@@test_orders = {}
|
227
262
|
|
228
263
|
# Returns the current test order. This returns
|
229
|
-
#
|
264
|
+
# `:alphabetic` by default.
|
230
265
|
def test_order
|
231
|
-
|
266
|
+
ancestors.each do |ancestor|
|
267
|
+
order = @@test_orders[ancestor]
|
268
|
+
return order if order
|
269
|
+
end
|
270
|
+
AVAILABLE_ORDERS.first
|
232
271
|
end
|
233
272
|
|
234
273
|
# Sets the current test order.
|
235
274
|
#
|
236
275
|
# Here are the available _order_:
|
237
|
-
#
|
238
|
-
#
|
239
|
-
#
|
240
|
-
#
|
241
|
-
#
|
242
|
-
#
|
276
|
+
#
|
277
|
+
# :alphabetic
|
278
|
+
# : Default. Tests are sorted in alphabetic order.
|
279
|
+
#
|
280
|
+
# :random
|
281
|
+
# : Tests are sorted in random order.
|
282
|
+
#
|
283
|
+
# :defined
|
284
|
+
# : Tests are sorted in defined order.
|
243
285
|
def test_order=(order)
|
244
286
|
@@test_orders[self] = order
|
245
287
|
end
|
@@ -250,22 +292,22 @@ module Test
|
|
250
292
|
# In declarative syntax usage, the following two
|
251
293
|
# test definitions are the almost same:
|
252
294
|
#
|
253
|
-
#
|
254
|
-
#
|
255
|
-
#
|
256
|
-
#
|
295
|
+
# description "register user"
|
296
|
+
# def test_register_user
|
297
|
+
# ...
|
298
|
+
# end
|
257
299
|
#
|
258
|
-
#
|
259
|
-
#
|
260
|
-
#
|
300
|
+
# test "register user" do
|
301
|
+
# ...
|
302
|
+
# end
|
261
303
|
#
|
262
304
|
# In test method mark usage, the "my_test_method" is
|
263
305
|
# treated as a test method:
|
264
306
|
#
|
265
|
-
#
|
266
|
-
#
|
267
|
-
#
|
268
|
-
#
|
307
|
+
# test
|
308
|
+
# def my_test_method
|
309
|
+
# assert_equal("call me", ...)
|
310
|
+
# end
|
269
311
|
def test(*test_description_or_targets, &block)
|
270
312
|
if block_given?
|
271
313
|
test_description = test_description_or_targets.first
|
@@ -299,10 +341,10 @@ module Test
|
|
299
341
|
# normal user" description with "test_register"
|
300
342
|
# test.
|
301
343
|
#
|
302
|
-
#
|
303
|
-
#
|
304
|
-
#
|
305
|
-
#
|
344
|
+
# description "register a normal user"
|
345
|
+
# def test_register
|
346
|
+
# ...
|
347
|
+
# end
|
306
348
|
def description(value, target=nil)
|
307
349
|
targets = [target].compact
|
308
350
|
attribute(:description, value, {}, *targets)
|
@@ -314,20 +356,22 @@ module Test
|
|
314
356
|
# the same in meaning:
|
315
357
|
#
|
316
358
|
# Standard:
|
317
|
-
#
|
318
|
-
# class
|
319
|
-
#
|
359
|
+
#
|
360
|
+
# class TestParent < Test::Unit::TestCase
|
361
|
+
# class TestChild < self
|
362
|
+
# def test_in_child
|
363
|
+
# end
|
320
364
|
# end
|
321
365
|
# end
|
322
|
-
# end
|
323
366
|
#
|
324
367
|
# Syntax sugar:
|
325
|
-
#
|
326
|
-
#
|
327
|
-
#
|
368
|
+
#
|
369
|
+
# class TestParent < Test::Unit::TestCase
|
370
|
+
# sub_test_case("TestChild") do
|
371
|
+
# def test_in_child
|
372
|
+
# end
|
328
373
|
# end
|
329
374
|
# end
|
330
|
-
# end
|
331
375
|
#
|
332
376
|
# The difference of them are the following:
|
333
377
|
#
|
@@ -365,6 +409,11 @@ module Test
|
|
365
409
|
# @option query [String] :method_name (nil)
|
366
410
|
# the method name for a test.
|
367
411
|
def test_defined?(query)
|
412
|
+
locations = find_locations(query)
|
413
|
+
not locations.empty?
|
414
|
+
end
|
415
|
+
|
416
|
+
def find_locations(query)
|
368
417
|
query_path = query[:path]
|
369
418
|
query_line = query[:line]
|
370
419
|
query_method_name = query[:method_name]
|
@@ -377,49 +426,62 @@ module Test
|
|
377
426
|
available_location = available_locations.find do |location|
|
378
427
|
query_line >= location[:line]
|
379
428
|
end
|
380
|
-
return
|
381
|
-
return
|
429
|
+
return [] if available_location.nil?
|
430
|
+
return [] if available_location[:test_case] != self
|
382
431
|
available_locations = [available_location]
|
383
432
|
end
|
384
433
|
if query_method_name
|
385
434
|
available_location = available_locations.find do |location|
|
386
|
-
|
435
|
+
location[:test_case] == self and
|
436
|
+
query_method_name == location[:method_name]
|
387
437
|
end
|
388
|
-
return
|
438
|
+
return [] if available_location.nil?
|
389
439
|
available_locations = [available_location]
|
390
440
|
end
|
391
441
|
|
392
|
-
|
442
|
+
available_locations
|
393
443
|
end
|
394
444
|
|
395
445
|
private
|
396
446
|
# @private
|
397
447
|
@@method_locations = {}
|
448
|
+
# @private
|
449
|
+
@@method_location_mutex = Mutex.new
|
450
|
+
|
398
451
|
# @private
|
399
452
|
def method_locations
|
400
453
|
@@method_locations[self] ||= []
|
401
454
|
end
|
402
455
|
|
403
456
|
# @private
|
404
|
-
def
|
405
|
-
|
406
|
-
|
407
|
-
path = self_location[:path] if self_location
|
457
|
+
def add_method_location(location)
|
458
|
+
@@method_location_mutex.synchronize do
|
459
|
+
method_locations << location
|
408
460
|
end
|
409
|
-
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
461
|
+
end
|
462
|
+
|
463
|
+
# @private
|
464
|
+
def target_method_locations(path)
|
465
|
+
@@method_location_mutex.synchronize do
|
466
|
+
if path.nil?
|
467
|
+
self_location = method_locations.first
|
468
|
+
path = self_location[:path] if self_location
|
469
|
+
end
|
470
|
+
return [] if path.nil?
|
471
|
+
|
472
|
+
target_locations = []
|
473
|
+
@@method_locations.each do |test_case, locations|
|
474
|
+
locations.each do |location|
|
475
|
+
absolete_path = File.expand_path(path)
|
476
|
+
location_path = location[:path]
|
477
|
+
location_basename = File.basename(location_path)
|
478
|
+
if location_path == absolete_path or location_basename == path
|
479
|
+
target_locations << location.merge(:test_case => test_case)
|
480
|
+
end
|
419
481
|
end
|
420
482
|
end
|
483
|
+
target_locations
|
421
484
|
end
|
422
|
-
target_locations
|
423
485
|
end
|
424
486
|
end
|
425
487
|
|
@@ -441,9 +503,7 @@ module Test
|
|
441
503
|
def valid? # :nodoc:
|
442
504
|
return false unless respond_to?(@method_name)
|
443
505
|
test_method = method(@method_name)
|
444
|
-
|
445
|
-
return false unless test_method.arity == 1
|
446
|
-
else
|
506
|
+
unless @internal_data.have_test_data?
|
447
507
|
return false unless test_method.arity <= 0
|
448
508
|
end
|
449
509
|
owner = Util::MethodOwnerFinder.find(self, @method_name)
|
@@ -508,35 +568,37 @@ module Test
|
|
508
568
|
#
|
509
569
|
# You can add additional setup tasks by the following
|
510
570
|
# code:
|
511
|
-
# class TestMyClass < Test::Unit::TestCase
|
512
|
-
# def setup
|
513
|
-
# ...
|
514
|
-
# end
|
515
571
|
#
|
516
|
-
#
|
517
|
-
#
|
518
|
-
#
|
519
|
-
#
|
572
|
+
# class TestMyClass < Test::Unit::TestCase
|
573
|
+
# def setup
|
574
|
+
# ...
|
575
|
+
# end
|
520
576
|
#
|
521
|
-
#
|
522
|
-
#
|
523
|
-
#
|
577
|
+
# setup
|
578
|
+
# def my_setup1
|
579
|
+
# ...
|
580
|
+
# end
|
524
581
|
#
|
525
|
-
#
|
526
|
-
#
|
527
|
-
#
|
528
|
-
# end
|
582
|
+
# setup do
|
583
|
+
# ... # setup callback1
|
584
|
+
# end
|
529
585
|
#
|
530
|
-
#
|
531
|
-
#
|
532
|
-
#
|
586
|
+
# setup
|
587
|
+
# def my_setup2
|
588
|
+
# ...
|
589
|
+
# end
|
590
|
+
#
|
591
|
+
# setup do
|
592
|
+
# ... # setup callback2
|
593
|
+
# end
|
533
594
|
#
|
534
|
-
#
|
535
|
-
#
|
595
|
+
# def test_my_class
|
596
|
+
# ...
|
597
|
+
# end
|
536
598
|
# end
|
537
|
-
# end
|
538
599
|
#
|
539
600
|
# Here is a call order:
|
601
|
+
#
|
540
602
|
# * setup
|
541
603
|
# * my_setup1
|
542
604
|
# * setup callback1
|
@@ -553,35 +615,37 @@ module Test
|
|
553
615
|
#
|
554
616
|
# You can add additional cleanup tasks by the following
|
555
617
|
# code:
|
556
|
-
# class TestMyClass < Test::Unit::TestCase
|
557
|
-
# def cleanup
|
558
|
-
# ...
|
559
|
-
# end
|
560
618
|
#
|
561
|
-
#
|
562
|
-
#
|
563
|
-
#
|
564
|
-
#
|
619
|
+
# class TestMyClass < Test::Unit::TestCase
|
620
|
+
# def cleanup
|
621
|
+
# ...
|
622
|
+
# end
|
565
623
|
#
|
566
|
-
#
|
567
|
-
#
|
568
|
-
#
|
624
|
+
# cleanup
|
625
|
+
# def my_cleanup1
|
626
|
+
# ...
|
627
|
+
# end
|
569
628
|
#
|
570
|
-
#
|
571
|
-
#
|
572
|
-
#
|
573
|
-
# end
|
629
|
+
# cleanup do
|
630
|
+
# ... # cleanup callback1
|
631
|
+
# end
|
574
632
|
#
|
575
|
-
#
|
576
|
-
#
|
577
|
-
#
|
633
|
+
# cleanup
|
634
|
+
# def my_cleanup2
|
635
|
+
# ...
|
636
|
+
# end
|
637
|
+
#
|
638
|
+
# cleanup do
|
639
|
+
# ... # cleanup callback2
|
640
|
+
# end
|
578
641
|
#
|
579
|
-
#
|
580
|
-
#
|
642
|
+
# def test_my_class
|
643
|
+
# ...
|
644
|
+
# end
|
581
645
|
# end
|
582
|
-
# end
|
583
646
|
#
|
584
647
|
# Here is a call order:
|
648
|
+
#
|
585
649
|
# * test_my_class
|
586
650
|
# * cleanup callback2
|
587
651
|
# * my_cleanup2
|
@@ -596,35 +660,37 @@ module Test
|
|
596
660
|
#
|
597
661
|
# You can add additional teardown tasks by the following
|
598
662
|
# code:
|
599
|
-
# class TestMyClass < Test::Unit::TestCase
|
600
|
-
# def teardown
|
601
|
-
# ...
|
602
|
-
# end
|
603
663
|
#
|
604
|
-
#
|
605
|
-
#
|
606
|
-
#
|
607
|
-
#
|
664
|
+
# class TestMyClass < Test::Unit::TestCase
|
665
|
+
# def teardown
|
666
|
+
# ...
|
667
|
+
# end
|
608
668
|
#
|
609
|
-
#
|
610
|
-
#
|
611
|
-
#
|
669
|
+
# teardown
|
670
|
+
# def my_teardown1
|
671
|
+
# ...
|
672
|
+
# end
|
612
673
|
#
|
613
|
-
#
|
614
|
-
#
|
615
|
-
#
|
616
|
-
# end
|
674
|
+
# teardown do
|
675
|
+
# ... # teardown callback1
|
676
|
+
# end
|
617
677
|
#
|
618
|
-
#
|
619
|
-
#
|
620
|
-
#
|
678
|
+
# teardown
|
679
|
+
# def my_teardown2
|
680
|
+
# ...
|
681
|
+
# end
|
682
|
+
#
|
683
|
+
# teardown do
|
684
|
+
# ... # teardown callback2
|
685
|
+
# end
|
621
686
|
#
|
622
|
-
#
|
623
|
-
#
|
687
|
+
# def test_my_class
|
688
|
+
# ...
|
689
|
+
# end
|
624
690
|
# end
|
625
|
-
# end
|
626
691
|
#
|
627
692
|
# Here is a call order:
|
693
|
+
#
|
628
694
|
# * test_my_class
|
629
695
|
# * teardown callback2
|
630
696
|
# * my_teardown2
|
@@ -644,18 +710,33 @@ module Test
|
|
644
710
|
|
645
711
|
# Returns a label of test data for the test. If the
|
646
712
|
# test isn't associated with any test data, it returns
|
647
|
-
#
|
713
|
+
# `nil`.
|
648
714
|
def data_label
|
649
715
|
@internal_data.test_data_label
|
650
716
|
end
|
651
717
|
|
718
|
+
# Returns test data for the test. If the test isn't associated
|
719
|
+
# with any test data, it returns `nil`.
|
720
|
+
def data
|
721
|
+
@internal_data.test_data
|
722
|
+
end
|
723
|
+
|
652
724
|
# Returns a human-readable name for the specific test that
|
653
725
|
# this instance of TestCase represents.
|
654
726
|
def name
|
727
|
+
"#{local_name}(#{self.class.name})"
|
728
|
+
end
|
729
|
+
|
730
|
+
# Returns a human-readable name for the specific test that this
|
731
|
+
# instance of TestCase represents.
|
732
|
+
#
|
733
|
+
# `#local_name` doesn't include class name. `#name` includes
|
734
|
+
# class name.
|
735
|
+
def local_name
|
655
736
|
if @internal_data.have_test_data?
|
656
|
-
"#{@method_name}[#{data_label}]
|
737
|
+
"#{@method_name}[#{data_label}]"
|
657
738
|
else
|
658
|
-
|
739
|
+
@method_name.to_s
|
659
740
|
end
|
660
741
|
end
|
661
742
|
|
@@ -733,13 +814,20 @@ module Test
|
|
733
814
|
end
|
734
815
|
|
735
816
|
def run_test
|
817
|
+
signature = "#{self.class}\##{@method_name}"
|
736
818
|
redefined_info = self[:redefined]
|
737
819
|
if redefined_info
|
738
|
-
notify("
|
820
|
+
notify("<#{signature}> was redefined",
|
739
821
|
:backtrace => redefined_info[:backtrace])
|
740
822
|
end
|
741
823
|
if @internal_data.have_test_data?
|
742
|
-
|
824
|
+
test_method = method(@method_name)
|
825
|
+
arity = test_method.arity
|
826
|
+
if arity.zero?
|
827
|
+
__send__(@method_name)
|
828
|
+
else
|
829
|
+
__send__(@method_name, @internal_data.test_data)
|
830
|
+
end
|
743
831
|
else
|
744
832
|
__send__(@method_name)
|
745
833
|
end
|