【问题标题】:Elixir: Test failure messagesElixir:测试失败消息
【发布时间】:2016-08-21 04:52:31
【问题描述】:

使用 Elixir 的 ExUnit 进行单元测试,每个人似乎都对测试失败消息感到兴奋。但是,如果我正在测试 == 以外的任何内容,我似乎无法收到有用的错误消息。

例如

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

    Expected truthy, got false

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

Expected "an unexpected string" to contain "expected string"

【问题讨论】:

  • 您可以编写一个assert_contains 宏来执行此操作,或者将自定义消息传递给assert,它将在失败时打印,但我不确定您到底是哪种解决方案寻找。
  • 所有资产所做的就是检查真实性。您可以提供一条消息,但就其本身而言,它不会自省您正在运行的在断言下产生结果的内容。这之前已经出现过,例如groups.google.com/forum/m/#!topic/elixir-lang-core/KYAkagiKr0w,但这仍然不像您要求的那样是自动的。

标签: elixir ex-unit


【解决方案1】:

对于针对String.contains? 进行测试的特殊情况,您可以考虑使用正则表达式匹配运算符=~,因为它会立即报告更好的测试失败消息。

一般来说,ExUnit 的assert 不会知道标准库中每个函数的内部语义。这就是您可以提供自定义错误消息的原因:

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

如果你有很多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

以下是表达式 assert 和 refute 将在 Elixir 1.3 中识别和定制输出:

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

其中大多数都得到相同的特殊处理:它们是中缀运算符,assert 将报告它看到的lhs、rhs 值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 2014-10-19
    • 2017-02-21
    • 2015-11-21
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多