Я начинаю использовать common test
в качестве тестовой среды в erlang.
Предположим, что у меня есть функция, которую я ожидаю принимать только положительные числа, и в любом другом случае она должна сработать.
positive_number(X) when > 0 -> {positive, X}.
и я хочу проверить это
positive_number(-5).
не завершится успешно.
Как проверить это поведение? На других языках я бы сказал, что тестовый пример ожидает какую-то ошибку или исключение и терпит неудачу, если тестируемая функция не выдает никаких ошибок из-за недопустимого недопустимого параметра. Как это сделать с помощью общего теста?
Обновление:
Я могу заставить его работать с
test_credit_invalid_input(_) ->
InvalidArgument = -1,
try mypackage:positive_number(InvalidArgument) of
_ -> ct:fail(not_failing_as_expected)
catch
error:function_clause -> ok
end.
но я думаю, что это слишком многословно, я хотел бы что-то вроде:
assert_error(mypackage:positive_number, [-1], error:function_clause)
Я предполагаю, что общий тест имеет это в каком-то месте, и мое отсутствие надлежащих знаний о структуре заставляет меня принимать такое подробное решение.
Обновление: Вдохновленный ответом Майкла, я создал следующую функцию:
assert_fail(Fun, Args, ExceptionType, ExceptionValue, Reason) ->
try apply(Fun, Args) of
_ -> ct:fail(Reason)
catch
ExceptionType:ExceptionValue -> ok
end.
и мой тест стал:
test_credit_invalid_input(_) ->
InvalidArgument = -1,
assert_fail(fun mypackage:positive_number/1,
[InvalidArgument],
error,
function_clause,
failed_to_catch_invalid_argument).
но я думаю, что это просто работает, потому что вызов assert_fail
немного читабельнее, чем вызов try....catch
в каждом тестовом примере.
Я все еще думаю, что в Common Test должна быть какая-то лучшая реализация, IMO, это уродливое повторение, чтобы этот тестовый шаблон неоднократно применялся в каждом проекте.