Elixir:测试失败消息

ste*_*eel 2 elixir ex-unit

使用Elixir的ExUnit进行单元测试,每个人似乎都对测试失败消息感到兴奋。但是,如果我测试的不是==,则似乎看不到任何有用的错误消息。

例如

assert String.contains(my_string, "expected string")

    Expected truthy, got false
Run Code Online (Sandbox Code Playgroud)

我更喜欢编写测试,以便使我的失败更有意义,从而使我能够快速迭代他们提供的反馈。有没有办法使测试失败的信息更多?例如

Expected "an unexpected string" to contain "expected string"
Run Code Online (Sandbox Code Playgroud)

Mar*_*lin 5

对于针对进行测试的特殊情况String.contains?,您可以考虑使用regex match运算符=~,因为它将开箱即用地报告更好的测试失败消息。

通常,虽然ExUnit assert不了解标准库中每个函数的内部语义。这就是为什么您可以提供自定义错误消息的原因:

assert String.contains?(my_string, "expected string"),
       ~s(Expected #{inspect my_string} to contain "expected string")
Run Code Online (Sandbox Code Playgroud)

如果您有许多断言String.contains?/2,则可以定义自己的断言:

def assert_contains(string, substring) do
  assert String.contains?(string, substring),
         "Expected #{inspect string} to contain #{inspect substring}"
end

test "my string" do
  assert_contains my_string, "expected string"
end
Run Code Online (Sandbox Code Playgroud)

以下是这些表达式assert,它们refute将识别并定制Elixir 1.3中的输出:

  • = 匹配运算符
  • match?/2 功能
  • ! 否定
  • == 等式运算符
  • < 少于
  • > 比...更棒
  • <= 小于或等于
  • >= 大于或等于
  • === 严格相等(区分浮点数和整数)
  • =~ 正则表达式匹配运算符
  • !== 严格的不平等
  • != 不等式
  • in 枚举成员

大多数这些得到同样的特殊待遇:他们是中缀操作符,并assert在将报告lhsrhs值它看到。