自定义 ExUnit 断言和模式匹配
Custom ExUnit assertions and pattern matching
我正在编写一个灵活的、基于适配器的错误跟踪库,并提供一组自定义测试断言函数,使集成测试更易于使用。
我有类似的东西
# /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: _}
如何使用模式匹配来完成这项工作?
非常感谢
如果您希望能够传入模式,则需要使用宏。这是用宏实现它的方法:
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
我正在编写一个灵活的、基于适配器的错误跟踪库,并提供一组自定义测试断言函数,使集成测试更易于使用。
我有类似的东西
# /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: _}
如何使用模式匹配来完成这项工作?
非常感谢
如果您希望能够传入模式,则需要使用宏。这是用宏实现它的方法:
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