unit-testing - Elixir:测试 GenEvent 的错误报告

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

我有一个 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 崩溃或引发一些异常来测试这一点,然后看看是否调用了通知。这感觉不太实用/Elixir,但我想测试一下当发生错误时是否会捕获错误。

最佳答案

我说继续吧,让事情崩溃。 :erlang.exit/2就可以了。

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

关于unit-testing - Elixir:测试 GenEvent 的错误报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35026659/

相关文章:

php - 是否可以在 PHP 中模拟 PECL 扩展?

elixir - Ecto assoc_constraint 不起作用

automated-tests - 如何在 eunit 中使用 debugMsg 以及如何在 eunit 测试中打印一些内容,尽管测试超时

Erlang HTTP 客户端 : inets or ibrowse or . ..?

java - 如何模拟 Spring ConversionService?

java - Android 中 JUnit 的替代方案

sql-server - 将 Phoenix 应用程序连接到 MS SQL Azure 数据库

Elixir 插头 : register_before_send

angular - 引用错误 : service is not defined