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.

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