使用Elixir的ExUnit进行单元测试,每个人都对测试失败消息感到兴奋。但是,如果我正在测试foo(*(x for x in nested))
以外的任何内容,我似乎无法获得有用的错误消息。
例如
==
我更喜欢编写我的测试,以便我的失败更具信息性,让我能够快速迭代他们提供的反馈。有没有办法获得更丰富的测试失败? e.g。
assert String.contains(my_string, "expected string")
Expected truthy, got false
答案 0 :(得分:5)
对于针对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
值。