minitest 5.14.4 → 5.20.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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data/History.rdoc +121 -1
- data/Manifest.txt +2 -0
- data/README.rdoc +67 -35
- data/Rakefile +2 -1
- data/lib/hoe/minitest.rb +0 -4
- data/lib/minitest/assertions.rb +57 -6
- data/lib/minitest/benchmark.rb +5 -5
- data/lib/minitest/expectations.rb +18 -0
- data/lib/minitest/mock.rb +116 -33
- data/lib/minitest/pride_plugin.rb +1 -1
- data/lib/minitest/spec.rb +9 -2
- data/lib/minitest/test.rb +44 -16
- data/lib/minitest/test_task.rb +302 -0
- data/lib/minitest/unit.rb +5 -8
- data/lib/minitest.rb +101 -36
- data/test/minitest/metametameta.rb +1 -1
- data/test/minitest/test_minitest_assertions.rb +142 -16
- data/test/minitest/test_minitest_benchmark.rb +2 -2
- data/test/minitest/test_minitest_mock.rb +275 -13
- data/test/minitest/test_minitest_reporter.rb +59 -17
- data/test/minitest/test_minitest_spec.rb +101 -16
- data/test/minitest/test_minitest_test.rb +230 -32
- data/test/minitest/test_minitest_test_task.rb +46 -0
- data.tar.gz.sig +0 -0
- metadata +19 -17
- metadata.gz.sig +0 -0
@@ -1,8 +1,14 @@
|
|
1
1
|
require "minitest/autorun"
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
def with_kwargs_env
|
4
|
+
ENV["MT_KWARGS_HAC\K"] = "1"
|
5
|
+
|
6
|
+
yield
|
7
|
+
ensure
|
8
|
+
ENV.delete "MT_KWARGS_HAC\K"
|
9
|
+
end
|
5
10
|
|
11
|
+
class TestMinitestMock < Minitest::Test
|
6
12
|
def setup
|
7
13
|
@mock = Minitest::Mock.new.expect(:foo, nil)
|
8
14
|
@mock.expect(:meaning_of_life, 42)
|
@@ -51,7 +57,7 @@ class TestMinitestMock < Minitest::Test
|
|
51
57
|
@mock.sum
|
52
58
|
end
|
53
59
|
|
54
|
-
assert_equal "mocked method :sum expects 2 arguments, got
|
60
|
+
assert_equal "mocked method :sum expects 2 arguments, got []", e.message
|
55
61
|
end
|
56
62
|
|
57
63
|
def test_return_mock_does_not_raise
|
@@ -133,7 +139,7 @@ class TestMinitestMock < Minitest::Test
|
|
133
139
|
@mock.expect :blah, 3, false
|
134
140
|
end
|
135
141
|
|
136
|
-
|
142
|
+
assert_match "args must be an array", e.message
|
137
143
|
end
|
138
144
|
|
139
145
|
def test_respond_appropriately
|
@@ -150,7 +156,7 @@ class TestMinitestMock < Minitest::Test
|
|
150
156
|
|
151
157
|
expected = "unmocked method :bar, expected one of [:foo, :meaning_of_life]"
|
152
158
|
|
153
|
-
|
159
|
+
assert_match expected, e.message
|
154
160
|
end
|
155
161
|
|
156
162
|
def test_assign_per_mock_return_values
|
@@ -210,7 +216,7 @@ class TestMinitestMock < Minitest::Test
|
|
210
216
|
mock.a
|
211
217
|
end
|
212
218
|
|
213
|
-
assert_equal "No more expects available for :a: []", e.message
|
219
|
+
assert_equal "No more expects available for :a: [] {}", e.message
|
214
220
|
end
|
215
221
|
|
216
222
|
def test_same_method_expects_are_verified_when_all_called
|
@@ -252,6 +258,30 @@ class TestMinitestMock < Minitest::Test
|
|
252
258
|
assert_equal exp, e.message
|
253
259
|
end
|
254
260
|
|
261
|
+
def test_delegator_calls_are_propagated
|
262
|
+
delegator = Object.new
|
263
|
+
mock = Minitest::Mock.new delegator
|
264
|
+
|
265
|
+
refute delegator.nil?
|
266
|
+
refute mock.nil?
|
267
|
+
assert_mock mock
|
268
|
+
end
|
269
|
+
|
270
|
+
def test_handles_kwargs_in_error_message
|
271
|
+
mock = Minitest::Mock.new
|
272
|
+
|
273
|
+
mock.expect :foo, nil, [], kw: true
|
274
|
+
mock.expect :foo, nil, [], kw: false
|
275
|
+
|
276
|
+
mock.foo kw: true
|
277
|
+
|
278
|
+
e = assert_raises(MockExpectationError) { mock.verify }
|
279
|
+
|
280
|
+
exp = "expected foo(:kw=>false) => nil, got [foo(:kw=>true) => nil]"
|
281
|
+
|
282
|
+
assert_equal exp, e.message
|
283
|
+
end
|
284
|
+
|
255
285
|
def test_verify_passes_when_mock_block_returns_true
|
256
286
|
mock = Minitest::Mock.new
|
257
287
|
mock.expect :foo, nil do
|
@@ -270,11 +300,188 @@ class TestMinitestMock < Minitest::Test
|
|
270
300
|
a1 == arg1 && a2 == arg2 && a3 == arg3
|
271
301
|
end
|
272
302
|
|
273
|
-
|
303
|
+
assert_silent do
|
304
|
+
if RUBY_VERSION > "3" then
|
305
|
+
mock.foo arg1, arg2, arg3
|
306
|
+
else
|
307
|
+
mock.foo arg1, arg2, **arg3 # oddity just for ruby 2.7
|
308
|
+
end
|
309
|
+
end
|
310
|
+
|
311
|
+
assert_mock mock
|
312
|
+
end
|
313
|
+
|
314
|
+
def test_mock_block_is_passed_keyword_args__block
|
315
|
+
arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" }
|
316
|
+
mock = Minitest::Mock.new
|
317
|
+
mock.expect :foo, nil do |k1:, k2:, k3:|
|
318
|
+
k1 == arg1 && k2 == arg2 && k3 == arg3
|
319
|
+
end
|
320
|
+
|
321
|
+
mock.foo(k1: arg1, k2: arg2, k3: arg3)
|
322
|
+
|
323
|
+
assert_mock mock
|
324
|
+
end
|
325
|
+
|
326
|
+
def test_mock_block_is_passed_keyword_args__block_bad_missing
|
327
|
+
arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" }
|
328
|
+
mock = Minitest::Mock.new
|
329
|
+
mock.expect :foo, nil do |k1:, k2:, k3:|
|
330
|
+
k1 == arg1 && k2 == arg2 && k3 == arg3
|
331
|
+
end
|
332
|
+
|
333
|
+
e = assert_raises ArgumentError do
|
334
|
+
mock.foo(k1: arg1, k2: arg2)
|
335
|
+
end
|
336
|
+
|
337
|
+
# basically testing ruby ... need ? for ruby < 2.7 :(
|
338
|
+
assert_match(/missing keyword: :?k3/, e.message)
|
339
|
+
end
|
340
|
+
|
341
|
+
def test_mock_block_is_passed_keyword_args__block_bad_extra
|
342
|
+
arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" }
|
343
|
+
mock = Minitest::Mock.new
|
344
|
+
mock.expect :foo, nil do |k1:, k2:|
|
345
|
+
k1 == arg1 && k2 == arg2 && k3 == arg3
|
346
|
+
end
|
347
|
+
|
348
|
+
e = assert_raises ArgumentError do
|
349
|
+
mock.foo(k1: arg1, k2: arg2, k3: arg3)
|
350
|
+
end
|
351
|
+
|
352
|
+
# basically testing ruby ... need ? for ruby < 2.7 :(
|
353
|
+
assert_match(/unknown keyword: :?k3/, e.message)
|
354
|
+
end
|
355
|
+
|
356
|
+
def test_mock_block_is_passed_keyword_args__block_bad_value
|
357
|
+
arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" }
|
358
|
+
mock = Minitest::Mock.new
|
359
|
+
mock.expect :foo, nil do |k1:, k2:, k3:|
|
360
|
+
k1 == arg1 && k2 == arg2 && k3 == arg3
|
361
|
+
end
|
362
|
+
|
363
|
+
e = assert_raises MockExpectationError do
|
364
|
+
mock.foo(k1: arg1, k2: arg2, k3: :BAD!)
|
365
|
+
end
|
366
|
+
|
367
|
+
exp = "mocked method :foo failed block w/ [] {:k1=>:bar, :k2=>[1, 2, 3], :k3=>:BAD!}"
|
368
|
+
assert_equal exp, e.message
|
369
|
+
end
|
370
|
+
|
371
|
+
def test_mock_block_is_passed_keyword_args__args
|
372
|
+
arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" }
|
373
|
+
mock = Minitest::Mock.new
|
374
|
+
mock.expect :foo, nil, k1: arg1, k2: arg2, k3: arg3
|
375
|
+
|
376
|
+
mock.foo(k1: arg1, k2: arg2, k3: arg3)
|
274
377
|
|
275
378
|
assert_mock mock
|
276
379
|
end
|
277
380
|
|
381
|
+
def test_mock_allow_all_kwargs__old_style_env
|
382
|
+
with_kwargs_env do
|
383
|
+
mock = Minitest::Mock.new
|
384
|
+
mock.expect :foo, true, [Hash]
|
385
|
+
assert_equal true, mock.foo(bar: 42)
|
386
|
+
end
|
387
|
+
end
|
388
|
+
|
389
|
+
def test_mock_allow_all_kwargs__old_style_env__rewrite
|
390
|
+
with_kwargs_env do
|
391
|
+
mock = Minitest::Mock.new
|
392
|
+
mock.expect :foo, true, [], bar: Integer
|
393
|
+
assert_equal true, mock.foo(bar: 42)
|
394
|
+
end
|
395
|
+
end
|
396
|
+
|
397
|
+
def test_mock_block_is_passed_keyword_args__args__old_style_bad
|
398
|
+
arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" }
|
399
|
+
mock = Minitest::Mock.new
|
400
|
+
mock.expect :foo, nil, [{k1: arg1, k2: arg2, k3: arg3}]
|
401
|
+
|
402
|
+
e = assert_raises ArgumentError do
|
403
|
+
mock.foo(k1: arg1, k2: arg2, k3: arg3)
|
404
|
+
end
|
405
|
+
|
406
|
+
assert_equal "mocked method :foo expects 1 arguments, got []", e.message
|
407
|
+
end
|
408
|
+
|
409
|
+
def test_mock_block_is_passed_keyword_args__args__old_style_env
|
410
|
+
with_kwargs_env do
|
411
|
+
arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" }
|
412
|
+
mock = Minitest::Mock.new
|
413
|
+
mock.expect :foo, nil, [{k1: arg1, k2: arg2, k3: arg3}]
|
414
|
+
|
415
|
+
mock.foo(k1: arg1, k2: arg2, k3: arg3)
|
416
|
+
|
417
|
+
assert_mock mock
|
418
|
+
end
|
419
|
+
end
|
420
|
+
|
421
|
+
def test_mock_block_is_passed_keyword_args__args__old_style_both
|
422
|
+
with_kwargs_env do
|
423
|
+
arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" }
|
424
|
+
mock = Minitest::Mock.new
|
425
|
+
|
426
|
+
assert_output nil, /Using MT_KWARGS_HAC. yet passing kwargs/ do
|
427
|
+
mock.expect :foo, nil, [{}], k1: arg1, k2: arg2, k3: arg3
|
428
|
+
end
|
429
|
+
|
430
|
+
mock.foo({}, k1: arg1, k2: arg2, k3: arg3)
|
431
|
+
|
432
|
+
assert_mock mock
|
433
|
+
end
|
434
|
+
end
|
435
|
+
|
436
|
+
def test_mock_block_is_passed_keyword_args__args_bad_missing
|
437
|
+
arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" }
|
438
|
+
mock = Minitest::Mock.new
|
439
|
+
mock.expect :foo, nil, k1: arg1, k2: arg2, k3: arg3
|
440
|
+
|
441
|
+
e = assert_raises ArgumentError do
|
442
|
+
mock.foo(k1: arg1, k2: arg2)
|
443
|
+
end
|
444
|
+
|
445
|
+
assert_equal "mocked method :foo expects 3 keyword arguments, got %p" % {k1: arg1, k2: arg2}, e.message
|
446
|
+
end
|
447
|
+
|
448
|
+
def test_mock_block_is_passed_keyword_args__args_bad_extra
|
449
|
+
arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" }
|
450
|
+
mock = Minitest::Mock.new
|
451
|
+
mock.expect :foo, nil, k1: arg1, k2: arg2
|
452
|
+
|
453
|
+
e = assert_raises ArgumentError do
|
454
|
+
mock.foo(k1: arg1, k2: arg2, k3: arg3)
|
455
|
+
end
|
456
|
+
|
457
|
+
assert_equal "mocked method :foo expects 2 keyword arguments, got %p" % {k1: arg1, k2: arg2, k3: arg3}, e.message
|
458
|
+
end
|
459
|
+
|
460
|
+
def test_mock_block_is_passed_keyword_args__args_bad_key
|
461
|
+
arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" }
|
462
|
+
mock = Minitest::Mock.new
|
463
|
+
mock.expect :foo, nil, k1: arg1, k2: arg2, k3: arg3
|
464
|
+
|
465
|
+
e = assert_raises MockExpectationError do
|
466
|
+
mock.foo(k1: arg1, k2: arg2, BAD: arg3)
|
467
|
+
end
|
468
|
+
|
469
|
+
assert_includes e.message, "unexpected keywords [:k1, :k2, :k3]"
|
470
|
+
assert_includes e.message, "vs [:k1, :k2, :BAD]"
|
471
|
+
end
|
472
|
+
|
473
|
+
def test_mock_block_is_passed_keyword_args__args_bad_val
|
474
|
+
arg1, arg2, arg3 = :bar, [1, 2, 3], { :a => "a" }
|
475
|
+
mock = Minitest::Mock.new
|
476
|
+
mock.expect :foo, nil, k1: arg1, k2: arg2, k3: arg3
|
477
|
+
|
478
|
+
e = assert_raises MockExpectationError do
|
479
|
+
mock.foo(k1: arg1, k2: :BAD!, k3: arg3)
|
480
|
+
end
|
481
|
+
|
482
|
+
assert_match(/unexpected keyword arguments.* vs .*:k2=>:BAD!/, e.message)
|
483
|
+
end
|
484
|
+
|
278
485
|
def test_mock_block_is_passed_function_block
|
279
486
|
mock = Minitest::Mock.new
|
280
487
|
block = proc { "bar" }
|
@@ -286,6 +493,13 @@ class TestMinitestMock < Minitest::Test
|
|
286
493
|
assert_mock mock
|
287
494
|
end
|
288
495
|
|
496
|
+
def test_mock_forward_keyword_arguments
|
497
|
+
mock = Minitest::Mock.new
|
498
|
+
mock.expect(:foo, nil) { |bar:| bar == 'bar' }
|
499
|
+
mock.foo(bar: 'bar')
|
500
|
+
assert_mock mock
|
501
|
+
end
|
502
|
+
|
289
503
|
def test_verify_fails_when_mock_block_returns_false
|
290
504
|
mock = Minitest::Mock.new
|
291
505
|
mock.expect :foo, nil do
|
@@ -293,12 +507,12 @@ class TestMinitestMock < Minitest::Test
|
|
293
507
|
end
|
294
508
|
|
295
509
|
e = assert_raises(MockExpectationError) { mock.foo }
|
296
|
-
exp = "mocked method :foo failed block w/ []"
|
510
|
+
exp = "mocked method :foo failed block w/ [] {}"
|
297
511
|
|
298
512
|
assert_equal exp, e.message
|
299
513
|
end
|
300
514
|
|
301
|
-
def
|
515
|
+
def test_mock_block_raises_if_args_passed
|
302
516
|
mock = Minitest::Mock.new
|
303
517
|
|
304
518
|
e = assert_raises(ArgumentError) do
|
@@ -309,7 +523,21 @@ class TestMinitestMock < Minitest::Test
|
|
309
523
|
|
310
524
|
exp = "args ignored when block given"
|
311
525
|
|
312
|
-
|
526
|
+
assert_match exp, e.message
|
527
|
+
end
|
528
|
+
|
529
|
+
def test_mock_block_raises_if_kwargs_passed
|
530
|
+
mock = Minitest::Mock.new
|
531
|
+
|
532
|
+
e = assert_raises(ArgumentError) do
|
533
|
+
mock.expect :foo, nil, kwargs:1 do
|
534
|
+
true
|
535
|
+
end
|
536
|
+
end
|
537
|
+
|
538
|
+
exp = "kwargs ignored when block given"
|
539
|
+
|
540
|
+
assert_match exp, e.message
|
313
541
|
end
|
314
542
|
|
315
543
|
def test_mock_returns_retval_when_called_with_block
|
@@ -499,7 +727,8 @@ class TestMinitestStub < Minitest::Test
|
|
499
727
|
end
|
500
728
|
end
|
501
729
|
|
502
|
-
exp = /
|
730
|
+
exp = jruby? ? /Undefined method nope_nope_nope for '#{self.class}::Time'/ :
|
731
|
+
/undefined method `nope_nope_nope' for( class)? `#{self.class}::Time'/
|
503
732
|
assert_match exp, e.message
|
504
733
|
end
|
505
734
|
|
@@ -518,6 +747,19 @@ class TestMinitestStub < Minitest::Test
|
|
518
747
|
@tc.assert_equal true, rs
|
519
748
|
end
|
520
749
|
|
750
|
+
def test_mock_with_yield_kwargs
|
751
|
+
mock = Minitest::Mock.new
|
752
|
+
rs = nil
|
753
|
+
|
754
|
+
File.stub :open, true, mock, kw:42 do
|
755
|
+
File.open "foo.txt", "r" do |f, kw:|
|
756
|
+
rs = kw
|
757
|
+
end
|
758
|
+
end
|
759
|
+
|
760
|
+
@tc.assert_equal 42, rs
|
761
|
+
end
|
762
|
+
|
521
763
|
alias test_stub_value__old test_stub_value # TODO: remove/rename
|
522
764
|
|
523
765
|
## Permutation Sets:
|
@@ -603,6 +845,26 @@ class TestMinitestStub < Minitest::Test
|
|
603
845
|
end
|
604
846
|
end
|
605
847
|
|
848
|
+
def test_stub__hash_as_last_real_arg
|
849
|
+
with_kwargs_env do
|
850
|
+
token = Object.new
|
851
|
+
def token.create_with_retry u, p; raise "shouldn't see this"; end
|
852
|
+
|
853
|
+
controller = Object.new
|
854
|
+
controller.define_singleton_method :create do |u, p|
|
855
|
+
token.create_with_retry u, p
|
856
|
+
end
|
857
|
+
|
858
|
+
params = Object.new
|
859
|
+
def params.to_hash; raise "nah"; end
|
860
|
+
|
861
|
+
token.stub(:create_with_retry, ->(u, p) { 42 }) do
|
862
|
+
act = controller.create :u, params
|
863
|
+
@tc.assert_equal 42, act
|
864
|
+
end
|
865
|
+
end
|
866
|
+
end
|
867
|
+
|
606
868
|
def test_stub_callable_block_5 # from tenderlove
|
607
869
|
@assertion_count += 1
|
608
870
|
Foo.stub5 :blocking, Bar.new do
|
@@ -821,8 +1083,8 @@ class TestMinitestStub < Minitest::Test
|
|
821
1083
|
end
|
822
1084
|
end
|
823
1085
|
end
|
824
|
-
exp =
|
825
|
-
|
1086
|
+
exp = /undefined method `write' for nil/
|
1087
|
+
assert_match exp, e.message
|
826
1088
|
end
|
827
1089
|
|
828
1090
|
def test_stub_value_block_args_6
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require "minitest/autorun"
|
2
2
|
require "minitest/metametameta"
|
3
|
+
require "forwardable"
|
3
4
|
|
4
5
|
class Runnable
|
5
6
|
def woot
|
@@ -12,30 +13,24 @@ class TestMinitestReporter < MetaMetaMetaTestCase
|
|
12
13
|
attr_accessor :r, :io
|
13
14
|
|
14
15
|
def new_composite_reporter
|
16
|
+
# Ruby bug in older versions of 2.2 & 2.3 on all platforms
|
17
|
+
# Latest Windows builds were 2.2.6 and 2.3.3. Latest Ruby releases were
|
18
|
+
# 2.2.10 and 2.3.8.
|
19
|
+
skip if windows? && RUBY_VERSION < '2.4'
|
15
20
|
reporter = Minitest::CompositeReporter.new
|
16
21
|
reporter << Minitest::SummaryReporter.new(self.io)
|
17
22
|
reporter << Minitest::ProgressReporter.new(self.io)
|
18
23
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
def reporter.results
|
24
|
-
first.results
|
25
|
-
end
|
26
|
-
|
27
|
-
def reporter.count
|
28
|
-
first.count
|
29
|
-
end
|
30
|
-
|
31
|
-
def reporter.assertions
|
32
|
-
first.assertions
|
33
|
-
end
|
24
|
+
# eg reporter.results -> reporters.first.results
|
25
|
+
reporter.extend Forwardable
|
26
|
+
reporter.delegate :first => :reporters
|
27
|
+
reporter.delegate %i[results count assertions options to_s] => :first
|
34
28
|
|
35
29
|
reporter
|
36
30
|
end
|
37
31
|
|
38
32
|
def setup
|
33
|
+
super
|
39
34
|
self.io = StringIO.new("")
|
40
35
|
self.r = new_composite_reporter
|
41
36
|
end
|
@@ -70,6 +65,12 @@ class TestMinitestReporter < MetaMetaMetaTestCase
|
|
70
65
|
@pt ||= Minitest::Result.from Minitest::Test.new(:woot)
|
71
66
|
end
|
72
67
|
|
68
|
+
def passing_test_with_metadata
|
69
|
+
test = Minitest::Test.new(:woot)
|
70
|
+
test.metadata[:meta] = :data
|
71
|
+
@pt ||= Minitest::Result.from test
|
72
|
+
end
|
73
|
+
|
73
74
|
def skip_test
|
74
75
|
unless defined? @st then
|
75
76
|
@st = Minitest::Test.new(:woot)
|
@@ -86,7 +87,25 @@ class TestMinitestReporter < MetaMetaMetaTestCase
|
|
86
87
|
def test_to_s
|
87
88
|
r.record passing_test
|
88
89
|
r.record fail_test
|
89
|
-
assert_match "woot", r.
|
90
|
+
assert_match "woot", r.to_s
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_options_skip_F
|
94
|
+
r.options[:skip] = "F"
|
95
|
+
|
96
|
+
r.record passing_test
|
97
|
+
r.record fail_test
|
98
|
+
|
99
|
+
refute_match "woot", r.to_s
|
100
|
+
end
|
101
|
+
|
102
|
+
def test_options_skip_E
|
103
|
+
r.options[:skip] = "E"
|
104
|
+
|
105
|
+
r.record passing_test
|
106
|
+
r.record error_test
|
107
|
+
|
108
|
+
refute_match "RuntimeError: no", r.to_s
|
90
109
|
end
|
91
110
|
|
92
111
|
def test_passed_eh_empty
|
@@ -126,7 +145,7 @@ class TestMinitestReporter < MetaMetaMetaTestCase
|
|
126
145
|
end
|
127
146
|
|
128
147
|
def test_passed_eh_skipped_verbose
|
129
|
-
r.
|
148
|
+
r.options[:verbose] = true
|
130
149
|
|
131
150
|
r.start
|
132
151
|
r.results << skip_test
|
@@ -153,6 +172,29 @@ class TestMinitestReporter < MetaMetaMetaTestCase
|
|
153
172
|
assert_equal 0, r.assertions
|
154
173
|
end
|
155
174
|
|
175
|
+
def test_record_pass_with_metadata
|
176
|
+
reporter = self.r
|
177
|
+
|
178
|
+
def reporter.metadata
|
179
|
+
@metadata
|
180
|
+
end
|
181
|
+
|
182
|
+
def reporter.record result
|
183
|
+
super
|
184
|
+
@metadata = result.metadata if result.metadata?
|
185
|
+
end
|
186
|
+
|
187
|
+
r.record passing_test_with_metadata
|
188
|
+
|
189
|
+
exp = { :meta => :data }
|
190
|
+
assert_equal exp, reporter.metadata
|
191
|
+
|
192
|
+
assert_equal ".", io.string
|
193
|
+
assert_empty r.results
|
194
|
+
assert_equal 1, r.count
|
195
|
+
assert_equal 0, r.assertions
|
196
|
+
end
|
197
|
+
|
156
198
|
def test_record_fail
|
157
199
|
fail_test = self.fail_test
|
158
200
|
r.record fail_test
|
@@ -137,6 +137,46 @@ describe Minitest::Spec do
|
|
137
137
|
end
|
138
138
|
end
|
139
139
|
|
140
|
+
def good_pattern
|
141
|
+
capture_io do # 3.0 is noisy
|
142
|
+
eval "[1,2,3] => [Integer, Integer, Integer]" # eval to escape parser for ruby<3
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def bad_pattern
|
147
|
+
capture_io do # 3.0 is noisy
|
148
|
+
eval "[1,2,3] => [Integer, Integer]" # eval to escape parser for ruby<3
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
it "needs to pattern match" do
|
153
|
+
@assertion_count = 1
|
154
|
+
|
155
|
+
if RUBY_VERSION > "3" then
|
156
|
+
expect { good_pattern }.must_pattern_match
|
157
|
+
else
|
158
|
+
assert_raises NotImplementedError do
|
159
|
+
expect {}.must_pattern_match
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
it "needs to error on bad pattern match" do
|
165
|
+
skip unless RUBY_VERSION > "3"
|
166
|
+
|
167
|
+
@assertion_count = 1
|
168
|
+
|
169
|
+
exp = if RUBY_VERSION.start_with? "3.0"
|
170
|
+
"[1, 2, 3]" # terrible error message!
|
171
|
+
else
|
172
|
+
/length mismatch/
|
173
|
+
end
|
174
|
+
|
175
|
+
assert_triggered exp do
|
176
|
+
expect { bad_pattern }.must_pattern_match
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
140
180
|
it "needs to ensure silence" do
|
141
181
|
@assertion_count -= 1 # no msg
|
142
182
|
@assertion_count += 2 # assert_output is 2 assertions
|
@@ -172,6 +212,7 @@ describe Minitest::Spec do
|
|
172
212
|
must_include
|
173
213
|
must_match
|
174
214
|
must_output
|
215
|
+
must_pattern_match
|
175
216
|
must_raise
|
176
217
|
must_respond_to
|
177
218
|
must_throw
|
@@ -505,7 +546,7 @@ describe Minitest::Spec do
|
|
505
546
|
it "needs to verify regexp matches" do
|
506
547
|
@assertion_count += 3 # must_match is 2 assertions
|
507
548
|
|
508
|
-
|
549
|
+
assert_kind_of MatchData, _("blah").must_match(/\w+/)
|
509
550
|
|
510
551
|
assert_triggered "Expected /\\d+/ to match \"blah\"." do
|
511
552
|
_("blah").must_match(/\d+/)
|
@@ -590,9 +631,10 @@ describe Minitest::Spec do
|
|
590
631
|
end
|
591
632
|
|
592
633
|
it "needs to verify throw" do
|
593
|
-
@assertion_count +=
|
634
|
+
@assertion_count += 4 # 2 extra tests
|
594
635
|
|
595
|
-
|
636
|
+
assert_nil expect { throw :blah }.must_throw(:blah)
|
637
|
+
assert_equal 42, expect { throw :blah, 42 }.must_throw(:blah)
|
596
638
|
|
597
639
|
assert_triggered "Expected :blah to have been thrown." do
|
598
640
|
expect {}.must_throw :blah
|
@@ -743,6 +785,10 @@ describe Minitest::Spec, :subject do
|
|
743
785
|
end
|
744
786
|
|
745
787
|
class TestMetaStatic < Minitest::Test
|
788
|
+
def assert_method_count expected, klass
|
789
|
+
assert_equal expected, klass.public_instance_methods.grep(/^test_/).count
|
790
|
+
end
|
791
|
+
|
746
792
|
def test_children
|
747
793
|
Minitest::Spec.children.clear # prevents parallel run
|
748
794
|
|
@@ -776,8 +822,8 @@ class TestMetaStatic < Minitest::Test
|
|
776
822
|
end
|
777
823
|
end
|
778
824
|
|
779
|
-
|
780
|
-
|
825
|
+
assert_method_count 1, outer
|
826
|
+
assert_method_count 1, inner
|
781
827
|
end
|
782
828
|
|
783
829
|
def test_it_wont_add_test_methods_to_children
|
@@ -791,14 +837,18 @@ class TestMetaStatic < Minitest::Test
|
|
791
837
|
end
|
792
838
|
end
|
793
839
|
|
794
|
-
|
795
|
-
|
840
|
+
assert_method_count 1, outer
|
841
|
+
assert_method_count 0, inner
|
796
842
|
end
|
797
843
|
end
|
798
844
|
|
799
845
|
class TestMeta < MetaMetaMetaTestCase
|
800
846
|
# do not call parallelize_me! here because specs use register_spec_type globally
|
801
847
|
|
848
|
+
def assert_defined_methods expected, klass
|
849
|
+
assert_equal expected, klass.instance_methods(false).sort.map(&:to_s)
|
850
|
+
end
|
851
|
+
|
802
852
|
def util_structure
|
803
853
|
y = z = nil
|
804
854
|
before_list = []
|
@@ -871,7 +921,7 @@ class TestMeta < MetaMetaMetaTestCase
|
|
871
921
|
end
|
872
922
|
end
|
873
923
|
|
874
|
-
test_name = spec_class.instance_methods.sort.grep(/
|
924
|
+
test_name = spec_class.instance_methods.sort.grep(/test_/).first
|
875
925
|
|
876
926
|
spec = spec_class.new test_name
|
877
927
|
|
@@ -920,9 +970,9 @@ class TestMeta < MetaMetaMetaTestCase
|
|
920
970
|
inner_methods2 = inner_methods1 +
|
921
971
|
%w[test_0002_anonymous test_0003_anonymous]
|
922
972
|
|
923
|
-
|
924
|
-
|
925
|
-
|
973
|
+
assert_defined_methods top_methods, x
|
974
|
+
assert_defined_methods inner_methods1, y
|
975
|
+
assert_defined_methods inner_methods2, z
|
926
976
|
end
|
927
977
|
|
928
978
|
def test_structure_postfix_it
|
@@ -939,8 +989,8 @@ class TestMeta < MetaMetaMetaTestCase
|
|
939
989
|
it "inner-it" do end
|
940
990
|
end
|
941
991
|
|
942
|
-
|
943
|
-
|
992
|
+
assert_defined_methods %w[test_0001_inner-it], y
|
993
|
+
assert_defined_methods %w[test_0001_inner-it], z
|
944
994
|
end
|
945
995
|
|
946
996
|
def test_setup_teardown_behavior
|
@@ -971,9 +1021,9 @@ class TestMeta < MetaMetaMetaTestCase
|
|
971
1021
|
].sort
|
972
1022
|
|
973
1023
|
assert_equal test_methods, [x1, x2]
|
974
|
-
|
975
|
-
|
976
|
-
|
1024
|
+
assert_defined_methods test_methods, x
|
1025
|
+
assert_defined_methods [], y
|
1026
|
+
assert_defined_methods [], z
|
977
1027
|
end
|
978
1028
|
|
979
1029
|
def test_structure_subclasses
|
@@ -1059,3 +1109,38 @@ class ValueMonadTest < Minitest::Test
|
|
1059
1109
|
assert_equal "c", struct.expect
|
1060
1110
|
end
|
1061
1111
|
end
|
1112
|
+
|
1113
|
+
describe Minitest::Spec, :infect_an_assertion do
|
1114
|
+
class << self
|
1115
|
+
attr_accessor :infect_mock
|
1116
|
+
end
|
1117
|
+
|
1118
|
+
def assert_infects exp, act, msg = nil, foo: nil, bar: nil
|
1119
|
+
self.class.infect_mock.assert_infects exp, act, msg, foo: foo, bar: bar
|
1120
|
+
end
|
1121
|
+
|
1122
|
+
infect_an_assertion :assert_infects, :must_infect
|
1123
|
+
infect_an_assertion :assert_infects, :must_infect_without_flipping, :dont_flip
|
1124
|
+
|
1125
|
+
it "infects assertions with kwargs" do
|
1126
|
+
mock = Minitest::Mock.new
|
1127
|
+
mock.expect :assert_infects, true, [:exp, :act, nil], foo: :foo, bar: :bar
|
1128
|
+
|
1129
|
+
self.class.infect_mock = mock
|
1130
|
+
|
1131
|
+
_(:act).must_infect :exp, foo: :foo, bar: :bar
|
1132
|
+
|
1133
|
+
assert_mock mock
|
1134
|
+
end
|
1135
|
+
|
1136
|
+
it "infects assertions with kwargs (dont_flip)" do
|
1137
|
+
mock = Minitest::Mock.new
|
1138
|
+
mock.expect :assert_infects, true, [:act, :exp, nil], foo: :foo, bar: :bar
|
1139
|
+
|
1140
|
+
self.class.infect_mock = mock
|
1141
|
+
|
1142
|
+
_(:act).must_infect_without_flipping :exp, foo: :foo, bar: :bar
|
1143
|
+
|
1144
|
+
assert_mock mock
|
1145
|
+
end
|
1146
|
+
end
|