【问题标题】:Elixir: Testing GenEvent for error reportsElixir:测试 GenEvent 的错误报告
【发布时间】:2023-04-07 20:52:01
【问题描述】:

我有一个 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 崩溃或引发一些异常来测试这一点,然后查看是否调用了 notify。这感觉不是很有功能/Elixir,但我想测试在导致错误时是否会捕获错误。

【问题讨论】:

    标签: unit-testing elixir erlang-otp gen-event


    【解决方案1】:

    我说去吧,把事情搞砸。 :erlang.exit/2 会成功的。

    OTP 和监督树并不容易。如果您真的想实现 Elixir 承诺的容错能力,则必须测试应用程序在错误条件下的行为。

    【讨论】:

    • 我会反对什么来检查记录器是否转发了错误?
    • @AaronDufall 好吧,您可能需要将Bugsnag.Mock 收到的值转发到某个地方,以便您的测试用例可以检索它并对其进行断言。实际实现将根据您的应用程序和测试的设置方式而有所不同。
    猜你喜欢
    • 2013-06-19
    • 1970-01-01
    • 2020-04-04
    • 2011-03-03
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    相关资源
    最近更新 更多