Какой смысл в meck: проверить?

Как новичок в meck, я собирал тест, который показывает различные функции. Однако я не могу понять, почему разработчик может вызвать meck:validate. Вот мой пример:

-module(meck_demo).

-include_lib("eunit/include/eunit.hrl").

validate_is_of_limited_use_test_() ->
    { foreach, fun setup_mock/0, fun cleanup_mock/1, 
      [fun validate_does_not_fail_if_a_function_is_not_called/0,
       fun validate_does_not_fail_if_a_function_is_called_with_wrong_arity/0,
       fun validate_does_not_fail_if_an_undefined_function_is_called/0,
       fun validate_does_fail_if_a_function_was_called_with_wrong_argument_types/0,
       fun validate_does_fail_if_expectation_throws_an_unexpected_exception/0 ]}.

validate_does_not_fail_if_a_function_is_not_called() ->
    meck:expect(womble, name, fun() -> "Wellington" end),   
    ?assert(meck:validate(womble)).

validate_does_not_fail_if_a_function_is_called_with_wrong_arity() ->
    meck:expect(womble, name, fun() -> "Madame Cholet" end),
    ?assertError(undef, womble:name(unexpected_arg)),
    ?assert(meck:validate(womble)).

validate_does_not_fail_if_an_undefined_function_is_called() ->
    ?assertError(undef, womble:fly()),
    ?assert(meck:validate(womble)).

validate_does_fail_if_a_function_was_called_with_wrong_argument_types() ->
    meck:expect(womble, jump, fun(Height) when Height < 1 -> 
                                ok
                              end),
    ?assertError(function_clause, womble:jump(999)),
    ?assertNot(meck:validate(womble)).

validate_does_fail_if_expectation_throws_an_unexpected_exception() ->
    meck:expect(womble, jump, fun(Height) -> 42 = Height end),
    ?assertError({badmatch, 999}, womble:jump(999)),
    ?assertNot(meck:validate(womble)).   

setup_mock() ->
    meck:new(womble, [non_strict]).

cleanup_mock(_SetupResult) ->
    meck:unload(womble).

Что мне не хватает?

- Обновлено, чтобы отразить случаи, которые Адам объясняет, могут быть пойманы

1 ответ

Решение

Вам удалось поразить практически каждый случай, не охваченный валидацией (добавлена ​​лучшая документация в 10c5063).

Проверка может обнаружить:

  • Когда функция была вызвана с неправильными типами аргументов (function_clause)
  • Когда было выброшено исключение
  • Когда было сгенерировано исключение и ожидается (через meck:exception/2), что все еще приводит к true возвращаясь из meck:validate/1

Проверка не может обнаружить:

  • Когда вы не вызывали функцию
  • Когда вы вызвали функцию с неправильным числом аргументов
  • Если вы вызвали неопределенную функцию

Причина, по которой он не может обнаружить эти случаи, заключается в том, как реализован Mock. Мек заменяет модуль на макет и процесс, который поддерживает макет. Все, что получает Мек, проходит через этот фиктивный модуль. Meck не вставляет себя на уровне вызывающей стороны (т. Е. В ваш модуль или в ваш тестовый пример), поэтому он не может знать, что вам не удалось вызвать модуль. Все сбои в вашем тестовом примере выше никогда не доходят до макета модуля.

Другие вопросы по тегам