没有 assert/refute 的 ExUnit,完全依赖模式匹配?

ExUnit without assert/refute, relying solely on pattern matching?

我正在测试函数的 return 值。两者中哪一个是首选方式?

test "extra verbose, using assert" do
  {:error, reason} = MyModule.my_fun
  assert reason == :nope
end

test "using pattern matching only" do
  {:error, :nope} = MyModule.my_fun
end

我喜欢第一个,因为我现在不喜欢,测试需要 assert 语句,而 运行 测试时的错误消息更具描述性。 Otoh,带行号的MatchError应该也够了。

您可以将 assert= 一起使用以获得 assert 和更具描述性的错误消息,并且只需一行代码:

assert {:error, :nope} = MyModule.my_fun

== 不同,您可以在 LHS 上使用任何模式,但在这种情况下,= 可以替换为 ==,因为 LHS 既是有效模式又是值。

失败时,您会收到一条错误消息,这比仅在没有 assert 的情况下进行模式匹配要好,例如

  1) test the truth (MTest)
     test/m_test.exs:10
     match (=) failed
     code:  {:error, :nope} = MyModule.my_fun()
     right: {:error, :nop}
     stacktrace:
       test/m_test.exs:11: (test)