Ключевое слово return возвращает лексический метод. То есть * test_iterate *.
Чтобы вернуть определенное значение из блока динамически в определенной области, вместо этого следует использовать ключевое слово break .
В вашем случае:
iterate { break("end of block") }
Тест не пройден. потому что второй оператор возврата метода итерации никогда не запустится.
Предполагаемая семантика должна выполняться с использованием исключений:
def iterate
return yield
rescue :exception
return "end of iterate"
end
def test_iterate
assert_equal( "end of iterate", iterate { raise :exception } )
assert_equal( "end of block", iterate { "end of block" } )
end