自定义ExUnit断言和模式匹配

时间:2017-11-21 09:13:48

标签: elixir ex-unit

我正在编写一个灵活的,基于适配器的错误跟踪库,并提供一组自定义测试断言函数,以使集成测试更易于使用。

我有类似

的东西
  # /lib/test_helpers.ex 

  ...

  @doc """
  Asserts specific exception and metadata was captured

  ## Example

      exception = %ArgumentError{message: "test"}
      exception |> MyApp.ErrorTracker.capture_exception(%{some_argument: 123})
      assert_exception_captured %ArgumentError{message: "test"}, %{some_argument: 123}
  """
  def assert_exception_captured(exception, extra) do
    assert_receive {:exception_captured, ^exception, ^extra}, 100
  end

哪个会将确切的异常传递给assert_exception_captured,但是在尝试对例如异常的结构进行模式匹配时它不起作用。

我希望能够做到这一点

...
assert_exception_captured _any_exception, %{some_argument: _}

如何使用模式匹配来完成这项工作?

非常感谢

1 个答案:

答案 0 :(得分:2)

如果您希望能够传递模式,则需要使用宏。这是你用宏来实现它的方法:

defmacro assert_exception_captured(exception, extra) do
  quote do
    assert_receive {:exception_captured, ^unquote(exception), unquote(extra)}, 100
  end
end

测试:

test "greets the world" do
  exception = %ArgumentError{message: "test"}
  send self(), {:exception_captured, exception, %{some_argument: 123}}
  assert_exception_captured exception, %{some_argument: _}
end

输出:

$ mix test
.

Finished in 0.02 seconds
1 test, 0 failures