2013-12-16 1 views
2

Иногда мне хотелось бы, чтобы модульный тест подтвердил, что какой-то код вызывает исключение, не зная точно класс исключения. Например, чтобы подтвердить, что это вызывает исключение, которое является kind_of?(StandardError), я хотел бы написать это:Как получить assert_raise для обработки подклассов исключений

assert_raise StandardError do 
    my_method 
end 

Это утверждение проходит, если исключение является экземпляром StandardError, но терпит неудачу, если исключение является экземпляром подкласса от StandardError. Мое лучшее решение заключается в следующем:

begin 
    my_method 
rescue StandardError => error 
    return 
end 
assert false, "no error from my_method" 

rescue делает обрабатывать исключения подклассов, как я хочу, так это работает. Но это немного неудобно. Любые лучшие идеи?

Это модуль Test :: Unit :: Assertions в Ruby 1.8.7.

ответ

0

Насколько я могу видеть, исключение не является обязательным в assert_raise

испытаний, если данный блок вызывает исключение. Допустимые типы исключений maye можно указать как необязательные аргументы.

Вы должны быть в состоянии написать

assert_raise { my_method } 
+0

Но тогда тест будет проходить, если (скажем) будет поднят SignalException, верно? Это исключение, но это не StandardError, поэтому я хочу, чтобы это случилось. –

+0

Я не понимаю. Вы хотите, чтобы assert_raise проверял, является ли ошибка экземпляром 'StandardError'? –

+0

Да, StandardError или его подкласс. Я сделаю это, чтобы сделать это более ясным. –

0

Это, по сути то же самое, что вы начали, но немного больше уверенности в пояснительных IMO:

begin 
    my_method 
rescue => e 
    # Could be any number of error classes: 
    # HTTPClient::ConnectTimeoutError, SocketError, etc. 
    assert e.class.ancestors.include?(StandardError), "Expected my_method to raise a subclass of StandardError, but #{e.class} was raised" 
    return 
end 

# Force the test to fail if no error was raised 
assert false, "Expected my_method to raise a subclass of StandardError, but no error was raised" 
+0

Почему 'e.class.ancestors.include? (StandardError)'? Как насчет 'e.is_a? StandardError'? – weakish