9

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

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带有行号的也应该足够了。

4

1 回答 1

19

您可以使用assertwith=来获取assert一条更具描述性的错误消息,并且只需一行代码:

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

与 with 不同==,您可以在 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)
于 2017-04-12T08:34:02.607 回答