Может ли Мекк издеваться над Эрлангом: выход?

Я хочу это в модуле супервизора:

stop() ->
  exit(whereis(mousetrap_sup), kill).

Так что наивный тест может сделать это:

stop_invokes_exit_test() ->
  meck:new(erlang, [unstick, passthrough]),
  meck:expect(erlang, whereis, 1, a_pid),
  meck:expect(erlang, exit, 2, true),
  mousetrap_sup:stop(),
  ?assert(meck:called(erlang, exit, [a_pid, kill])).

Не удивительно, что он висит.

Я могу видеть, где было бы невозможно выполнить этот код с тестом, но есть ли способ?

2 ответа

Решение

Вы можете запустить процесс, используя это имя, и проверить причину выхода:

{Pid, Ref} = spawn_monitor(timer, sleep, [infinity]),
register(my_sup, Pid),
mousetrap_sup:stop(),
receive
    {'DOWN', Ref, process, Pid, Reason} ->
        ?assertEqual(killed, Reason)
after 1000 ->
    error(not_killed)
end.

Из документации Мека

У Мека будут проблемы с издевательством над некоторыми модулями, так как Мекк перекомпилирует и перезагружает модули Поскольку Erlang имеет плоское пространство имен модулей, замена модуля должна выполняться глобально в Erlang VM. Это означает, что некоторые модули не могут быть смоделированы. Ниже приведен неисчерпывающий список модулей, которые могут быть проблематичными для макета или вообще невозможны:

  • Эрл
  • Операционные системы
  • крипто-
  • компилировать
  • Глобальный

Так что нет, вы не можете издеваться над выходом. Вы можете, однако, обернуть вызов выхода в другую функцию и объединить эту функцию.

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