2016-08-20 129 views
2

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

例如

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

    Expected truthy, got false 

我宁愿让我的失败是更多的信息来写我的测试,让我很快对他们给出的反馈循环。有没有办法获得更丰富的测试失败?例如

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

你可以编写一个'assert_contains'宏来执行此操作,或者将自定义消息传递给'assert',它将在失败时打印,但我不确定你正在寻找什么样的解决方案。 – Dogbert

+0

所有资产都是检查真实性。您可以提供一条消息,但是它本身并不会反省您在运行时产生结果的内容。这已在之前发布,例如https://groups.google.com/forum/m/#!主题/ elixir-lang-core/KYAkagiKr0w,但这仍然不像你所要求的那样是自动的。 –

回答

4

对于测试的特定情况下对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 

这里是表达assertrefute将承认并定制输出在药剂1.3:

  • =匹配运算符
  • match?/2功能
  • !否定
  • ==相等运算
  • <小于
  • >大于
  • <=小于或等于
  • 更大>=大于或等于
  • ===全等(区分花车和整数)
  • =~正则表达式匹配操作
  • !==不全
  • !=不平等
  • in成员枚举

大多数这些得到同样的特殊待遇:他们是中缀运营商和assert会报告在它看到的lhs,rhs值。