minitest 5.15.0 → 5.16.1
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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/History.rdoc +35 -0
- data/Manifest.txt +2 -0
- data/README.rdoc +40 -10
- data/Rakefile +1 -1
- data/lib/minitest/assertions.rb +2 -0
- data/lib/minitest/benchmark.rb +5 -5
- data/lib/minitest/mock.rb +94 -30
- data/lib/minitest/pride_plugin.rb +1 -1
- data/lib/minitest/spec.rb +1 -1
- data/lib/minitest/test.rb +21 -6
- data/lib/minitest/test_task.rb +305 -0
- data/lib/minitest/unit.rb +5 -8
- data/lib/minitest.rb +30 -13
- data/test/minitest/metametameta.rb +1 -1
- data/test/minitest/test_minitest_assertions.rb +10 -7
- data/test/minitest/test_minitest_benchmark.rb +2 -2
- data/test/minitest/test_minitest_mock.rb +223 -5
- data/test/minitest/test_minitest_reporter.rb +1 -0
- data/test/minitest/test_minitest_spec.rb +22 -14
- data/test/minitest/test_minitest_test.rb +96 -23
- data/test/minitest/test_minitest_test_task.rb +46 -0
- data.tar.gz.sig +0 -0
- metadata +16 -14
- metadata.gz.sig +0 -0
@@ -51,7 +51,7 @@ class TestMinitestMock < Minitest::Test
|
|
51
51
|
@mock.sum
|
52
52
|
end
|
53
53
|
|
54
|
-
assert_equal "mocked method :sum expects 2 arguments, got
|
54
|
+
assert_equal "mocked method :sum expects 2 arguments, got []", e.message
|
55
55
|
end
|
56
56
|
|
57
57
|
def test_return_mock_does_not_raise
|
@@ -210,7 +210,7 @@ class TestMinitestMock < Minitest::Test
|
|
210
210
|
mock.a
|
211
211
|
end
|
212
212
|
|
213
|
-
assert_equal "No more expects available for :a: []", e.message
|
213
|
+
assert_equal "No more expects available for :a: [] {}", e.message
|
214
214
|
end
|
215
215
|
|
216
216
|
def test_same_method_expects_are_verified_when_all_called
|
@@ -252,6 +252,21 @@ class TestMinitestMock < Minitest::Test
|
|
252
252
|
assert_equal exp, e.message
|
253
253
|
end
|
254
254
|
|
255
|
+
def test_handles_kwargs_in_error_message
|
256
|
+
mock = Minitest::Mock.new
|
257
|
+
|
258
|
+
mock.expect :foo, nil, [], kw: true
|
259
|
+
mock.expect :foo, nil, [], kw: false
|
260
|
+
|
261
|
+
mock.foo kw: true
|
262
|
+
|
263
|
+
e = assert_raises(MockExpectationError) { mock.verify }
|
264
|
+
|
265
|
+
exp = "expected foo(:kw=>false) => nil, got [foo(:kw=>true) => nil]"
|
266
|
+
|
267
|
+
assert_equal exp, e.message
|
268
|
+
end
|
269
|
+
|
255
270
|
def test_verify_passes_when_mock_block_returns_true
|
256
271
|
mock = Minitest::Mock.new
|
257
272
|
mock.expect :foo, nil do
|
@@ -270,11 +285,180 @@ class TestMinitestMock < Minitest::Test
|
|
270
285
|
a1 == arg1 && a2 == arg2 && a3 == arg3
|
271
286
|
end
|
272
287
|
|
273
|
-
|
288
|
+
assert_silent do
|
289
|
+
if RUBY_VERSION > "3" then
|
290
|
+
mock.foo arg1, arg2, arg3
|
291
|
+
else
|
292
|
+
mock.foo arg1, arg2, **arg3 # oddity just for ruby 2.7
|
293
|
+
end
|
294
|
+
end
|
295
|
+
|
296
|
+
assert_mock mock
|
297
|
+
end
|
298
|
+
|
299
|
+
def test_mock_block_is_passed_keyword_args__block
|
300
|
+
arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" }
|
301
|
+
mock = Minitest::Mock.new
|
302
|
+
mock.expect :foo, nil do |k1:, k2:, k3:|
|
303
|
+
k1 == arg1 && k2 == arg2 && k3 == arg3
|
304
|
+
end
|
305
|
+
|
306
|
+
mock.foo(k1: arg1, k2: arg2, k3: arg3)
|
274
307
|
|
275
308
|
assert_mock mock
|
276
309
|
end
|
277
310
|
|
311
|
+
def test_mock_block_is_passed_keyword_args__block_bad_missing
|
312
|
+
arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" }
|
313
|
+
mock = Minitest::Mock.new
|
314
|
+
mock.expect :foo, nil do |k1:, k2:, k3:|
|
315
|
+
k1 == arg1 && k2 == arg2 && k3 == arg3
|
316
|
+
end
|
317
|
+
|
318
|
+
e = assert_raises ArgumentError do
|
319
|
+
mock.foo(k1: arg1, k2: arg2)
|
320
|
+
end
|
321
|
+
|
322
|
+
# basically testing ruby ... need ? for ruby < 2.7 :(
|
323
|
+
assert_match(/missing keyword: :?k3/, e.message)
|
324
|
+
end
|
325
|
+
|
326
|
+
def test_mock_block_is_passed_keyword_args__block_bad_extra
|
327
|
+
arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" }
|
328
|
+
mock = Minitest::Mock.new
|
329
|
+
mock.expect :foo, nil do |k1:, k2:|
|
330
|
+
k1 == arg1 && k2 == arg2 && k3 == arg3
|
331
|
+
end
|
332
|
+
|
333
|
+
e = assert_raises ArgumentError do
|
334
|
+
mock.foo(k1: arg1, k2: arg2, k3: arg3)
|
335
|
+
end
|
336
|
+
|
337
|
+
# basically testing ruby ... need ? for ruby < 2.7 :(
|
338
|
+
assert_match(/unknown keyword: :?k3/, e.message)
|
339
|
+
end
|
340
|
+
|
341
|
+
def test_mock_block_is_passed_keyword_args__block_bad_value
|
342
|
+
arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" }
|
343
|
+
mock = Minitest::Mock.new
|
344
|
+
mock.expect :foo, nil do |k1:, k2:, k3:|
|
345
|
+
k1 == arg1 && k2 == arg2 && k3 == arg3
|
346
|
+
end
|
347
|
+
|
348
|
+
e = assert_raises MockExpectationError do
|
349
|
+
mock.foo(k1: arg1, k2: arg2, k3: :BAD!)
|
350
|
+
end
|
351
|
+
|
352
|
+
exp = "mocked method :foo failed block w/ [] {:k1=>:bar, :k2=>[1, 2, 3], :k3=>:BAD!}"
|
353
|
+
assert_equal exp, e.message
|
354
|
+
end
|
355
|
+
|
356
|
+
def test_mock_block_is_passed_keyword_args__args
|
357
|
+
arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" }
|
358
|
+
mock = Minitest::Mock.new
|
359
|
+
mock.expect :foo, nil, k1: arg1, k2: arg2, k3: arg3
|
360
|
+
|
361
|
+
mock.foo(k1: arg1, k2: arg2, k3: arg3)
|
362
|
+
|
363
|
+
assert_mock mock
|
364
|
+
end
|
365
|
+
|
366
|
+
def with_kwargs_env
|
367
|
+
ENV["MT_KWARGS_HAC\K"] = "1"
|
368
|
+
|
369
|
+
yield
|
370
|
+
ensure
|
371
|
+
ENV.delete "MT_KWARGS_HAC\K"
|
372
|
+
end
|
373
|
+
|
374
|
+
def test_mock_block_is_passed_keyword_args__args__old_style_bad
|
375
|
+
arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" }
|
376
|
+
mock = Minitest::Mock.new
|
377
|
+
mock.expect :foo, nil, [{k1: arg1, k2: arg2, k3: arg3}]
|
378
|
+
|
379
|
+
e = assert_raises ArgumentError do
|
380
|
+
mock.foo(k1: arg1, k2: arg2, k3: arg3)
|
381
|
+
end
|
382
|
+
|
383
|
+
assert_equal "mocked method :foo expects 1 arguments, got []", e.message
|
384
|
+
end
|
385
|
+
|
386
|
+
def test_mock_block_is_passed_keyword_args__args__old_style_env
|
387
|
+
with_kwargs_env do
|
388
|
+
arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" }
|
389
|
+
mock = Minitest::Mock.new
|
390
|
+
mock.expect :foo, nil, [{k1: arg1, k2: arg2, k3: arg3}]
|
391
|
+
|
392
|
+
mock.foo(k1: arg1, k2: arg2, k3: arg3)
|
393
|
+
|
394
|
+
assert_mock mock
|
395
|
+
end
|
396
|
+
end
|
397
|
+
|
398
|
+
def test_mock_block_is_passed_keyword_args__args__old_style_both
|
399
|
+
with_kwargs_env do
|
400
|
+
arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" }
|
401
|
+
mock = Minitest::Mock.new
|
402
|
+
|
403
|
+
assert_output nil, /Using MT_KWARGS_HAC. yet passing kwargs/ do
|
404
|
+
mock.expect :foo, nil, [{}], k1: arg1, k2: arg2, k3: arg3
|
405
|
+
end
|
406
|
+
|
407
|
+
mock.foo({}, k1: arg1, k2: arg2, k3: arg3)
|
408
|
+
|
409
|
+
assert_mock mock
|
410
|
+
end
|
411
|
+
end
|
412
|
+
|
413
|
+
def test_mock_block_is_passed_keyword_args__args_bad_missing
|
414
|
+
arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" }
|
415
|
+
mock = Minitest::Mock.new
|
416
|
+
mock.expect :foo, nil, k1: arg1, k2: arg2, k3: arg3
|
417
|
+
|
418
|
+
e = assert_raises ArgumentError do
|
419
|
+
mock.foo(k1: arg1, k2: arg2)
|
420
|
+
end
|
421
|
+
|
422
|
+
assert_equal "mocked method :foo expects 3 keyword arguments, got %p" % {k1: arg1, k2: arg2}, e.message
|
423
|
+
end
|
424
|
+
|
425
|
+
def test_mock_block_is_passed_keyword_args__args_bad_extra
|
426
|
+
arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" }
|
427
|
+
mock = Minitest::Mock.new
|
428
|
+
mock.expect :foo, nil, k1: arg1, k2: arg2
|
429
|
+
|
430
|
+
e = assert_raises ArgumentError do
|
431
|
+
mock.foo(k1: arg1, k2: arg2, k3: arg3)
|
432
|
+
end
|
433
|
+
|
434
|
+
assert_equal "mocked method :foo expects 2 keyword arguments, got %p" % {k1: arg1, k2: arg2, k3: arg3}, e.message
|
435
|
+
end
|
436
|
+
|
437
|
+
def test_mock_block_is_passed_keyword_args__args_bad_key
|
438
|
+
arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" }
|
439
|
+
mock = Minitest::Mock.new
|
440
|
+
mock.expect :foo, nil, k1: arg1, k2: arg2, k3: arg3
|
441
|
+
|
442
|
+
e = assert_raises MockExpectationError do
|
443
|
+
mock.foo(k1: arg1, k2: arg2, BAD: arg3)
|
444
|
+
end
|
445
|
+
|
446
|
+
assert_includes e.message, "unexpected keywords [:k1, :k2, :k3]"
|
447
|
+
assert_includes e.message, "vs [:k1, :k2, :BAD]"
|
448
|
+
end
|
449
|
+
|
450
|
+
def test_mock_block_is_passed_keyword_args__args_bad_val
|
451
|
+
arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" }
|
452
|
+
mock = Minitest::Mock.new
|
453
|
+
mock.expect :foo, nil, k1: arg1, k2: arg2, k3: arg3
|
454
|
+
|
455
|
+
e = assert_raises MockExpectationError do
|
456
|
+
mock.foo(k1: arg1, k2: :BAD!, k3: arg3)
|
457
|
+
end
|
458
|
+
|
459
|
+
assert_match(/unexpected keyword arguments.* vs .*:k2=>:BAD!/, e.message)
|
460
|
+
end
|
461
|
+
|
278
462
|
def test_mock_block_is_passed_function_block
|
279
463
|
mock = Minitest::Mock.new
|
280
464
|
block = proc { "bar" }
|
@@ -286,6 +470,13 @@ class TestMinitestMock < Minitest::Test
|
|
286
470
|
assert_mock mock
|
287
471
|
end
|
288
472
|
|
473
|
+
def test_mock_forward_keyword_arguments
|
474
|
+
mock = Minitest::Mock.new
|
475
|
+
mock.expect(:foo, nil) { |bar:| bar == 'bar' }
|
476
|
+
mock.foo(bar: 'bar')
|
477
|
+
assert_mock mock
|
478
|
+
end
|
479
|
+
|
289
480
|
def test_verify_fails_when_mock_block_returns_false
|
290
481
|
mock = Minitest::Mock.new
|
291
482
|
mock.expect :foo, nil do
|
@@ -293,12 +484,12 @@ class TestMinitestMock < Minitest::Test
|
|
293
484
|
end
|
294
485
|
|
295
486
|
e = assert_raises(MockExpectationError) { mock.foo }
|
296
|
-
exp = "mocked method :foo failed block w/ []"
|
487
|
+
exp = "mocked method :foo failed block w/ [] {}"
|
297
488
|
|
298
489
|
assert_equal exp, e.message
|
299
490
|
end
|
300
491
|
|
301
|
-
def
|
492
|
+
def test_mock_block_raises_if_args_passed
|
302
493
|
mock = Minitest::Mock.new
|
303
494
|
|
304
495
|
e = assert_raises(ArgumentError) do
|
@@ -312,6 +503,20 @@ class TestMinitestMock < Minitest::Test
|
|
312
503
|
assert_match exp, e.message
|
313
504
|
end
|
314
505
|
|
506
|
+
def test_mock_block_raises_if_kwargs_passed
|
507
|
+
mock = Minitest::Mock.new
|
508
|
+
|
509
|
+
e = assert_raises(ArgumentError) do
|
510
|
+
mock.expect :foo, nil, kwargs:1 do
|
511
|
+
true
|
512
|
+
end
|
513
|
+
end
|
514
|
+
|
515
|
+
exp = "kwargs ignored when block given"
|
516
|
+
|
517
|
+
assert_match exp, e.message
|
518
|
+
end
|
519
|
+
|
315
520
|
def test_mock_returns_retval_when_called_with_block
|
316
521
|
mock = Minitest::Mock.new
|
317
522
|
mock.expect(:foo, 32) do
|
@@ -519,6 +724,19 @@ class TestMinitestStub < Minitest::Test
|
|
519
724
|
@tc.assert_equal true, rs
|
520
725
|
end
|
521
726
|
|
727
|
+
def test_mock_with_yield_kwargs
|
728
|
+
mock = Minitest::Mock.new
|
729
|
+
rs = nil
|
730
|
+
|
731
|
+
File.stub :open, true, mock, kw:42 do
|
732
|
+
File.open "foo.txt", "r" do |f, kw:|
|
733
|
+
rs = kw
|
734
|
+
end
|
735
|
+
end
|
736
|
+
|
737
|
+
@tc.assert_equal 42, rs
|
738
|
+
end
|
739
|
+
|
522
740
|
alias test_stub_value__old test_stub_value # TODO: remove/rename
|
523
741
|
|
524
742
|
## Permutation Sets:
|
@@ -505,7 +505,7 @@ describe Minitest::Spec do
|
|
505
505
|
it "needs to verify regexp matches" do
|
506
506
|
@assertion_count += 3 # must_match is 2 assertions
|
507
507
|
|
508
|
-
|
508
|
+
assert_kind_of MatchData, _("blah").must_match(/\w+/)
|
509
509
|
|
510
510
|
assert_triggered "Expected /\\d+/ to match \"blah\"." do
|
511
511
|
_("blah").must_match(/\d+/)
|
@@ -744,6 +744,10 @@ describe Minitest::Spec, :subject do
|
|
744
744
|
end
|
745
745
|
|
746
746
|
class TestMetaStatic < Minitest::Test
|
747
|
+
def assert_method_count expected, klass
|
748
|
+
assert_equal expected, klass.public_instance_methods.grep(/^test_/).count
|
749
|
+
end
|
750
|
+
|
747
751
|
def test_children
|
748
752
|
Minitest::Spec.children.clear # prevents parallel run
|
749
753
|
|
@@ -777,8 +781,8 @@ class TestMetaStatic < Minitest::Test
|
|
777
781
|
end
|
778
782
|
end
|
779
783
|
|
780
|
-
|
781
|
-
|
784
|
+
assert_method_count 1, outer
|
785
|
+
assert_method_count 1, inner
|
782
786
|
end
|
783
787
|
|
784
788
|
def test_it_wont_add_test_methods_to_children
|
@@ -792,14 +796,18 @@ class TestMetaStatic < Minitest::Test
|
|
792
796
|
end
|
793
797
|
end
|
794
798
|
|
795
|
-
|
796
|
-
|
799
|
+
assert_method_count 1, outer
|
800
|
+
assert_method_count 0, inner
|
797
801
|
end
|
798
802
|
end
|
799
803
|
|
800
804
|
class TestMeta < MetaMetaMetaTestCase
|
801
805
|
# do not call parallelize_me! here because specs use register_spec_type globally
|
802
806
|
|
807
|
+
def assert_defined_methods expected, klass
|
808
|
+
assert_equal expected, klass.instance_methods(false).sort.map(&:to_s)
|
809
|
+
end
|
810
|
+
|
803
811
|
def util_structure
|
804
812
|
y = z = nil
|
805
813
|
before_list = []
|
@@ -872,7 +880,7 @@ class TestMeta < MetaMetaMetaTestCase
|
|
872
880
|
end
|
873
881
|
end
|
874
882
|
|
875
|
-
test_name = spec_class.instance_methods.sort.grep(/
|
883
|
+
test_name = spec_class.instance_methods.sort.grep(/test_/).first
|
876
884
|
|
877
885
|
spec = spec_class.new test_name
|
878
886
|
|
@@ -921,9 +929,9 @@ class TestMeta < MetaMetaMetaTestCase
|
|
921
929
|
inner_methods2 = inner_methods1 +
|
922
930
|
%w[test_0002_anonymous test_0003_anonymous]
|
923
931
|
|
924
|
-
|
925
|
-
|
926
|
-
|
932
|
+
assert_defined_methods top_methods, x
|
933
|
+
assert_defined_methods inner_methods1, y
|
934
|
+
assert_defined_methods inner_methods2, z
|
927
935
|
end
|
928
936
|
|
929
937
|
def test_structure_postfix_it
|
@@ -940,8 +948,8 @@ class TestMeta < MetaMetaMetaTestCase
|
|
940
948
|
it "inner-it" do end
|
941
949
|
end
|
942
950
|
|
943
|
-
|
944
|
-
|
951
|
+
assert_defined_methods %w[test_0001_inner-it], y
|
952
|
+
assert_defined_methods %w[test_0001_inner-it], z
|
945
953
|
end
|
946
954
|
|
947
955
|
def test_setup_teardown_behavior
|
@@ -972,9 +980,9 @@ class TestMeta < MetaMetaMetaTestCase
|
|
972
980
|
].sort
|
973
981
|
|
974
982
|
assert_equal test_methods, [x1, x2]
|
975
|
-
|
976
|
-
|
977
|
-
|
983
|
+
assert_defined_methods test_methods, x
|
984
|
+
assert_defined_methods [], y
|
985
|
+
assert_defined_methods [], z
|
978
986
|
end
|
979
987
|
|
980
988
|
def test_structure_subclasses
|
@@ -48,9 +48,11 @@ class TestMinitestUnit < MetaMetaMetaTestCase
|
|
48
48
|
"test/test_autotest.rb:62:in `test_add_exception'"]
|
49
49
|
ex = util_expand_bt ex
|
50
50
|
|
51
|
-
|
51
|
+
Minitest::Test.io_lock.synchronize do # try not to trounce in parallel
|
52
|
+
fu = Minitest.filter_backtrace(bt)
|
52
53
|
|
53
|
-
|
54
|
+
assert_equal ex, fu
|
55
|
+
end
|
54
56
|
end
|
55
57
|
|
56
58
|
def test_filter_backtrace_all_unit
|
@@ -71,8 +73,10 @@ class TestMinitestUnit < MetaMetaMetaTestCase
|
|
71
73
|
bt = util_expand_bt bt
|
72
74
|
|
73
75
|
ex = ["-e:1"]
|
74
|
-
|
75
|
-
|
76
|
+
Minitest::Test.io_lock.synchronize do # try not to trounce in parallel
|
77
|
+
fu = Minitest.filter_backtrace bt
|
78
|
+
assert_equal ex, fu
|
79
|
+
end
|
76
80
|
end
|
77
81
|
|
78
82
|
def test_filter_backtrace__empty
|
@@ -95,24 +99,26 @@ class TestMinitestUnit < MetaMetaMetaTestCase
|
|
95
99
|
end
|
96
100
|
|
97
101
|
expected = clean <<-EOM
|
98
|
-
|
102
|
+
FE
|
99
103
|
|
100
104
|
Finished in 0.00
|
101
105
|
|
102
|
-
1)
|
103
|
-
FakeNamedTestXX#test_this_is_non_ascii_failure_message:
|
104
|
-
RuntimeError: ЁЁЁ
|
105
|
-
FILE:LINE:in `test_this_is_non_ascii_failure_message'
|
106
|
-
|
107
|
-
2) Failure:
|
106
|
+
1) Failure:
|
108
107
|
FakeNamedTestXX#test_this_is_not_ascii_assertion [FILE:LINE]:
|
109
108
|
Expected: \"ЁЁЁ\"
|
110
109
|
Actual: \"ёёё\"
|
111
110
|
|
111
|
+
2) Error:
|
112
|
+
FakeNamedTestXX#test_this_is_non_ascii_failure_message:
|
113
|
+
RuntimeError: ЁЁЁ
|
114
|
+
FILE:LINE:in `test_this_is_non_ascii_failure_message'
|
115
|
+
|
112
116
|
2 runs, 1 assertions, 1 failures, 1 errors, 0 skips
|
113
117
|
EOM
|
114
118
|
|
115
|
-
|
119
|
+
Minitest::Test.io_lock.synchronize do # try not to trounce in parallel
|
120
|
+
assert_report expected
|
121
|
+
end
|
116
122
|
end
|
117
123
|
|
118
124
|
def test_passed_eh_teardown_good
|
@@ -158,11 +164,7 @@ class TestMinitestUnit < MetaMetaMetaTestCase
|
|
158
164
|
end
|
159
165
|
|
160
166
|
def util_expand_bt bt
|
161
|
-
|
162
|
-
bt.map { |f| (f =~ /^\./) ? File.expand_path(f) : f }
|
163
|
-
else
|
164
|
-
bt
|
165
|
-
end
|
167
|
+
bt.map { |f| (f =~ /^\./) ? File.expand_path(f) : f }
|
166
168
|
end
|
167
169
|
end
|
168
170
|
|
@@ -254,7 +256,7 @@ class TestMinitestRunner < MetaMetaMetaTestCase
|
|
254
256
|
end
|
255
257
|
|
256
258
|
expected = clean <<-EOM
|
257
|
-
E
|
259
|
+
.E
|
258
260
|
|
259
261
|
Finished in 0.00
|
260
262
|
|
@@ -301,7 +303,7 @@ class TestMinitestRunner < MetaMetaMetaTestCase
|
|
301
303
|
setup_basic_tu
|
302
304
|
|
303
305
|
expected = clean <<-EOM
|
304
|
-
F
|
306
|
+
.F
|
305
307
|
|
306
308
|
Finished in 0.00
|
307
309
|
|
@@ -328,6 +330,10 @@ class TestMinitestRunner < MetaMetaMetaTestCase
|
|
328
330
|
end
|
329
331
|
end
|
330
332
|
|
333
|
+
def test_seed # this is set for THIS run, so I'm not testing it's actual value
|
334
|
+
assert_instance_of Integer, Minitest.seed
|
335
|
+
end
|
336
|
+
|
331
337
|
def test_run_failing_filtered
|
332
338
|
setup_basic_tu
|
333
339
|
|
@@ -485,7 +491,7 @@ class TestMinitestRunner < MetaMetaMetaTestCase
|
|
485
491
|
end
|
486
492
|
|
487
493
|
expected = clean <<-EOM
|
488
|
-
S
|
494
|
+
.S
|
489
495
|
|
490
496
|
Finished in 0.00
|
491
497
|
|
@@ -512,8 +518,8 @@ class TestMinitestRunner < MetaMetaMetaTestCase
|
|
512
518
|
end
|
513
519
|
|
514
520
|
expected = clean <<-EOM
|
515
|
-
FakeNamedTestXX#test_skip = 0.00 s = S
|
516
521
|
FakeNamedTestXX#test_something = 0.00 s = .
|
522
|
+
FakeNamedTestXX#test_skip = 0.00 s = S
|
517
523
|
|
518
524
|
Finished in 0.00
|
519
525
|
|
@@ -527,6 +533,33 @@ class TestMinitestRunner < MetaMetaMetaTestCase
|
|
527
533
|
assert_report expected, %w[--seed 42 --verbose]
|
528
534
|
end
|
529
535
|
|
536
|
+
def test_run_skip_show_skips
|
537
|
+
@tu =
|
538
|
+
Class.new FakeNamedTest do
|
539
|
+
def test_something
|
540
|
+
assert true
|
541
|
+
end
|
542
|
+
|
543
|
+
def test_skip
|
544
|
+
skip "not yet"
|
545
|
+
end
|
546
|
+
end
|
547
|
+
|
548
|
+
expected = clean <<-EOM
|
549
|
+
.S
|
550
|
+
|
551
|
+
Finished in 0.00
|
552
|
+
|
553
|
+
1) Skipped:
|
554
|
+
FakeNamedTestXX#test_skip [FILE:LINE]:
|
555
|
+
not yet
|
556
|
+
|
557
|
+
2 runs, 1 assertions, 0 failures, 0 errors, 1 skips
|
558
|
+
EOM
|
559
|
+
|
560
|
+
assert_report expected, %w[--seed 42 --show-skips]
|
561
|
+
end
|
562
|
+
|
530
563
|
def test_run_with_other_runner
|
531
564
|
@tu =
|
532
565
|
Class.new FakeNamedTest do
|
@@ -627,6 +660,8 @@ class TestMinitestRunner < MetaMetaMetaTestCase
|
|
627
660
|
2 runs, 2 assertions, 0 failures, 0 errors, 0 skips
|
628
661
|
EOM
|
629
662
|
|
663
|
+
skip if Minitest.parallel_executor.size < 2 # locks up test runner if 1 CPU
|
664
|
+
|
630
665
|
assert_report(expected) do |reporter|
|
631
666
|
reporter.extend(Module.new {
|
632
667
|
define_method("record") do |result|
|
@@ -805,13 +840,51 @@ class TestMinitestRunnable < Minitest::Test
|
|
805
840
|
end
|
806
841
|
|
807
842
|
def test_spec_marshal_with_exception
|
808
|
-
klass = describe("whatever") {
|
843
|
+
klass = describe("whatever") {
|
844
|
+
it("raises, badly") {
|
845
|
+
raise Class.new(StandardError), "this is bad!"
|
846
|
+
}
|
847
|
+
}
|
848
|
+
|
809
849
|
rm = klass.runnable_methods.first
|
810
850
|
|
811
851
|
# Run the test
|
812
852
|
@tc = klass.new(rm).run
|
813
853
|
|
814
854
|
assert_kind_of Minitest::Result, @tc
|
855
|
+
assert_instance_of Minitest::UnexpectedError, @tc.failure
|
856
|
+
|
857
|
+
msg = @tc.failure.error.message
|
858
|
+
assert_includes msg, "Neutered Exception #<Class:"
|
859
|
+
assert_includes msg, "this is bad!"
|
860
|
+
|
861
|
+
# Pass it over the wire
|
862
|
+
over_the_wire = Marshal.load Marshal.dump @tc
|
863
|
+
|
864
|
+
assert_equal @tc.time, over_the_wire.time
|
865
|
+
assert_equal @tc.name, over_the_wire.name
|
866
|
+
assert_equal @tc.assertions, over_the_wire.assertions
|
867
|
+
assert_equal @tc.failures, over_the_wire.failures
|
868
|
+
assert_equal @tc.klass, over_the_wire.klass
|
869
|
+
end
|
870
|
+
|
871
|
+
def test_spec_marshal_with_exception_nameerror
|
872
|
+
klass = describe("whatever") {
|
873
|
+
it("raises nameerror") {
|
874
|
+
NOPE::does_not_exist
|
875
|
+
}
|
876
|
+
}
|
877
|
+
|
878
|
+
rm = klass.runnable_methods.first
|
879
|
+
|
880
|
+
# Run the test
|
881
|
+
@tc = klass.new(rm).run
|
882
|
+
|
883
|
+
assert_kind_of Minitest::Result, @tc
|
884
|
+
assert_instance_of Minitest::UnexpectedError, @tc.failure
|
885
|
+
|
886
|
+
msg = @tc.failure.error.message
|
887
|
+
assert_includes msg, "uninitialized constant TestMinitestRunnable::NOPE"
|
815
888
|
|
816
889
|
# Pass it over the wire
|
817
890
|
over_the_wire = Marshal.load Marshal.dump @tc
|
@@ -885,7 +958,7 @@ class TestMinitestUnitTestCase < Minitest::Test
|
|
885
958
|
random_tests_3 = sample_test_case 1_000
|
886
959
|
|
887
960
|
assert_equal random_tests_1, random_tests_2
|
888
|
-
|
961
|
+
assert_equal random_tests_1, random_tests_3
|
889
962
|
end
|
890
963
|
|
891
964
|
def test_runnable_methods_sorted
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require "minitest/autorun"
|
2
|
+
require "hoe"
|
3
|
+
|
4
|
+
require "minitest/test_task"
|
5
|
+
|
6
|
+
Hoe.load_plugins # make sure Hoe::Test is loaded
|
7
|
+
|
8
|
+
class TestHoeTest < Minitest::Test
|
9
|
+
PATH = "test/minitest/test_minitest_test_task.rb"
|
10
|
+
|
11
|
+
mt_path = %w[lib test .].join File::PATH_SEPARATOR
|
12
|
+
|
13
|
+
MT_EXPECTED = %W[-I#{mt_path} -w
|
14
|
+
-e '%srequire "#{PATH}"'
|
15
|
+
--].join(" ") + " "
|
16
|
+
|
17
|
+
def test_make_test_cmd_for_minitest
|
18
|
+
skip "Using TESTOPTS... skipping" if ENV["TESTOPTS"]
|
19
|
+
|
20
|
+
require "minitest/test_task"
|
21
|
+
|
22
|
+
framework = %(require "minitest/autorun"; )
|
23
|
+
|
24
|
+
@tester = Minitest::TestTask.create :test do |t|
|
25
|
+
t.test_globs = [PATH]
|
26
|
+
end
|
27
|
+
|
28
|
+
assert_equal MT_EXPECTED % [framework].join("; "), @tester.make_test_cmd
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_make_test_cmd_for_minitest_prelude
|
32
|
+
skip "Using TESTOPTS... skipping" if ENV["TESTOPTS"]
|
33
|
+
|
34
|
+
require "minitest/test_task"
|
35
|
+
|
36
|
+
prelude = %(require "other/file")
|
37
|
+
framework = %(require "minitest/autorun"; )
|
38
|
+
|
39
|
+
@tester = Minitest::TestTask.create :test do |t|
|
40
|
+
t.test_prelude = prelude
|
41
|
+
t.test_globs = [PATH]
|
42
|
+
end
|
43
|
+
|
44
|
+
assert_equal MT_EXPECTED % [prelude, framework].join("; "), @tester.make_test_cmd
|
45
|
+
end
|
46
|
+
end
|
data.tar.gz.sig
CHANGED
Binary file
|