Может ли Мекк издеваться над Эрлангом: выход?
Я хочу это в модуле супервизора:
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. Это означает, что некоторые модули не могут быть смоделированы. Ниже приведен неисчерпывающий список модулей, которые могут быть проблематичными для макета или вообще невозможны:
- Эрл
- Операционные системы
- крипто-
- компилировать
- Глобальный
Так что нет, вы не можете издеваться над выходом. Вы можете, однако, обернуть вызов выхода в другую функцию и объединить эту функцию.