Elixir: тестирование GenEvent для сообщений об ошибках
У меня есть GenEvent
который был добавлен в качестве обработчика, как так :error_logger.add_report_handler(HoloNet.ErrorLogger)
Чтобы ошибки / исключения регистрировались и передавались в службу мониторинга исключений.
У меня есть следующий код в поведении события
defmodule MyApp.ErrorLogger do
use GenEvent
@bugsnag_client Application.get_env(:my_app, :bugsnag_client)
def init(_opts), do: {:ok, self}
def handle_event({:error_report, _gl, {_pid, _type, [message | _]}}, state) do
{ error, stacktrace } = extract_exception(message[:error_info])
context = extract_context(stacktrace)
@bugsnag_client.notify(error,stacktrace, context: context, release_stage: Mix.env |> to_string)
{:ok, state}
end
def handle_event({_level, _gl, _event}, state) do
{:ok, state}
end
defp extract_exception(error_info) do
{ _, exception, _ } = error_info
exception
end
defp extract_context(stacktrace) do
stacktrace |> List.first |> elem 0
end
end
Клиент, который делает запрос http, макетируется с помощью конфигурации приложения.
defmodule Bugsnag.Mock do
@behaviour Bugsnag
def notify(error,stacktrace, options \\ []), do: nil
end
Он работает так, как должен, когда на производстве, но я хотел иметь тестовое покрытие.
Я думал о том, чтобы проверить это, разбив GenServer или вызвав какое-то исключение, а затем посмотреть, будет ли вызвано уведомление. Это не очень функционально / эликсир, но я хотел проверить, будут ли ошибки регистрироваться при возникновении ошибки.
1 ответ
Я говорю: давай, давай, давай. :erlang.exit/2
сделает свое дело.
OTP и деревья наблюдения не легки. Тестирование работы приложения в условиях ошибки необходимо, если вы действительно хотите достичь обещанной отказоустойчивости elixir.