Skip to content

Commit 96ba1da

Browse files
committed
+ Block-assertions (eg assert_output) now error if raised inside the block. (casperisfine)
This will potentially cause some of your tests to fail: ```ruby assert_raises do # 4) bypassed assert_output "blah\n" do # 3) rescues and raises UnexpectedError puts "not_blah" # 1) output raise "boom!" # 2) raised end end ``` Re-order to: ```ruby assert_output "blah\n" do # 4) captured and compared assert_raises RuntimeError do # 3) caught puts "blah" # 1) output raise "boom!" # 2) raised end end ``` Closes #809. [git-p4: depot-paths = "//src/minitest/dev/": change = 12414]
1 parent 02e35ce commit 96ba1da

File tree

2 files changed

+141
-3
lines changed

2 files changed

+141
-3
lines changed

lib/minitest/assertions.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,10 @@ def assert_output stdout = nil, stderr = nil
341341
x = send out_msg, stdout, out, "In stdout" if out_msg
342342

343343
(!stdout || x) && (!stderr || y)
344+
rescue Assertion
345+
raise
346+
rescue => e
347+
raise UnexpectedError, e
344348
end
345349

346350
##
@@ -485,6 +489,10 @@ def assert_throws sym, msg = nil
485489
end
486490

487491
assert caught, message(msg) { default }
492+
rescue Assertion
493+
raise
494+
rescue => e
495+
raise UnexpectedError, e
488496
end
489497

490498
##

test/minitest/test_minitest_assertions.rb

Lines changed: 133 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,14 @@ def assert_triggered expected, klass = Minitest::Assertion
7777
self.send assert_msg, expected, msg
7878
end
7979

80+
def assert_unexpected expected
81+
expected = Regexp.new expected if String === expected
82+
83+
assert_triggered expected, Minitest::UnexpectedError do
84+
yield
85+
end
86+
end
87+
8088
def clean s
8189
s.gsub(/^ {6,10}/, "")
8290
end
@@ -603,12 +611,117 @@ def test_assert_output_triggered_out
603611
end
604612
end
605613

606-
def test_assert_output_without_block
614+
def test_assert_output_no_block
607615
assert_triggered "assert_output requires a block to capture output." do
608616
@tc.assert_output "blah"
609617
end
610618
end
611619

620+
def test_assert_output_nested_assert_uncaught
621+
@assertion_count = 1
622+
623+
assert_triggered "Epic Fail!" do
624+
@tc.assert_output "blah\n" do
625+
puts "blah"
626+
@tc.flunk
627+
end
628+
end
629+
end
630+
631+
def test_assert_output_nested_raise
632+
@assertion_count = 2
633+
634+
@tc.assert_output "blah\n" do
635+
@tc.assert_raises RuntimeError do
636+
puts "blah"
637+
raise "boom!"
638+
end
639+
end
640+
end
641+
642+
def test_assert_output_nested_raise_bad
643+
@assertion_count = 0
644+
645+
assert_unexpected "boom!" do
646+
@tc.assert_raises do # 2) bypassed via UnexpectedError
647+
@tc.assert_output "blah\n" do # 1) captures and raises UnexpectedError
648+
puts "not_blah"
649+
raise "boom!"
650+
end
651+
end
652+
end
653+
end
654+
655+
def test_assert_output_nested_raise_mismatch
656+
# this test is redundant, but illustrative
657+
@assertion_count = 0
658+
659+
assert_unexpected "boom!" do
660+
@tc.assert_raises RuntimeError do # 2) bypassed via UnexpectedError
661+
@tc.assert_output "blah\n" do # 1) captures and raises UnexpectedError
662+
puts "not_blah"
663+
raise ArgumentError, "boom!"
664+
end
665+
end
666+
end
667+
end
668+
669+
def test_assert_output_nested_throw_caught
670+
@assertion_count = 2
671+
672+
@tc.assert_output "blah\n" do
673+
@tc.assert_throws :boom! do
674+
puts "blah"
675+
throw :boom!
676+
end
677+
end
678+
end
679+
680+
def test_assert_output_nested_throw_caught_bad
681+
@assertion_count = 1 # want 0; can't prevent throw from escaping :(
682+
683+
@tc.assert_throws :boom! do # 2) captured via catch
684+
@tc.assert_output "blah\n" do # 1) bypassed via throw
685+
puts "not_blah"
686+
throw :boom!
687+
end
688+
end
689+
end
690+
691+
def test_assert_output_nested_throw_mismatch
692+
@assertion_count = 0
693+
694+
assert_unexpected "uncaught throw :boom!" do
695+
@tc.assert_throws :not_boom! do # 2) captured via assert_throws+rescue
696+
@tc.assert_output "blah\n" do # 1) bypassed via throw
697+
puts "not_blah"
698+
throw :boom!
699+
end
700+
end
701+
end
702+
end
703+
704+
def test_assert_output_uncaught_raise
705+
@assertion_count = 0
706+
707+
assert_unexpected "RuntimeError: boom!" do
708+
@tc.assert_output "blah\n" do
709+
puts "not_blah"
710+
raise "boom!"
711+
end
712+
end
713+
end
714+
715+
def test_assert_output_uncaught_throw
716+
@assertion_count = 0
717+
718+
assert_unexpected "uncaught throw :boom!" do
719+
@tc.assert_output "blah\n" do
720+
puts "not_blah"
721+
throw :boom!
722+
end
723+
end
724+
end
612725
def test_assert_predicate
613726
@tc.assert_predicate "", :empty?
614727
end
@@ -671,6 +784,19 @@ def test_assert_raises_signals
671784
end
672785
end
673786

787+
def test_assert_raises_throw_nested_bad
788+
@assertion_count = 0
789+
790+
assert_unexpected "RuntimeError: boom!" do
791+
@tc.assert_raises do
792+
@tc.assert_throws :blah do
793+
raise "boom!"
794+
throw :not_blah
795+
end
796+
end
797+
end
798+
end
799+
674800
##
675801
# *sigh* This is quite an odd scenario, but it is from real (albeit
676802
# ugly) test code in ruby-core:
@@ -875,7 +1001,9 @@ def test_assert_throws
8751001
end
8761002

8771003
def test_assert_throws_argument_exception
878-
@tc.assert_raises ArgumentError do
1004+
@assertion_count = 0
1005+
1006+
assert_unexpected "ArgumentError" do
8791007
@tc.assert_throws :blah do
8801008
raise ArgumentError
8811009
end
@@ -891,7 +1019,9 @@ def test_assert_throws_different
8911019
end
8921020

8931021
def test_assert_throws_name_error
894-
@tc.assert_raises NameError do
1022+
@assertion_count = 0
1023+
1024+
assert_unexpected "NameError" do
8951025
@tc.assert_throws :blah do
8961026
raise NameError
8971027
end

0 commit comments

Comments
 (0)