ExUnit.Assertions
该模块包含一组默认导入到测试用例中的断言函数。
一般来说,开发人员会希望在测试中使用通用断言宏。 这个宏反省你的代码,并在出现故障时提供良好的报告。 例如,assert some_fun()== 10将失败(假设some_fun()返回13):
Comparison (using ==) failed in:
code: some_fun() == 10
left: 13
right: 10该模块还提供其他便利功能,如assert_in_delta和assert_raise,以便轻松处理其他常见情况,例如检查浮点数或处理异常。
功能
assert(assertion)
主张它的论点是一个真理值
assert(value, message)
断言值是真实的,否则显示给定的消息
assert_in_delta(value1,value2,delta,message \ nil)
断言value1与value2不超过delta
assert_raise(exception, function)
断言exception在function失效。返回获救的异常,否则失败。
assert_raise(exception, message, function)
断言在执行函数期间引发异常的预期消息可能是正则表达式或确切的字符串。 返回救出的异常,否则失败
assert_receive(pattern,timeout \ Application.fetch_env!(:ex_unit,:assert_receive_timeout),failure_message \ nil)
断言在超时期限内接收到或将要接收的消息匹配模式,以毫秒为单位指定
assert_received(pattern,failure_message \ nil)
断言已收到消息匹配模式并位于当前进程的邮箱中
catch_error(expression)
断言expression会导致错误。返回错误,否则失败
catch_exit(expression)
断言expression会退出。返回退出状态/消息,否则失败
catch_throw(expression)
断言expression会抛出一个价值。返回抛出的值,否则失败。
flunk(message \ "Flunked!")
没有消息
refute(assertion)
一个否定的断言,期望表达式是false或nil
refute(value, message)
断言value是nil或false(即value非真)
refute_in_delta(value1, value2, delta, message \ nil)
断言value1和value2不在delta范围内
refute_receive(pattern,timeout \ Application.fetch_env!(:ex_unit,:refute_receive_timeout),failure_message \ nil)
断言pattern在timeout指定的时间段内没有收到消息匹配(并且不会被接收),以毫秒为单位
refute_received(pattern,failure_message \ nil)
断言pattern没有收到消息匹配(即它不在当前进程的邮箱中)
assert(assertion) (macro)
断言它的论点是一个真理值。
assert反思底层表达,并在出现故障时提供良好的报告。例如,如果表达式使用比较运算符,则消息将显示双方的值。
assert 1 + 2 + 3 + 4 > 15将失败并显示以下消息:
Assertion with > failed
code: 1 + 2 + 3 + 4 > 15
left: 10
right: 15同样,如果给出了匹配表达式,它将报告该匹配的任何失败。给出:
assert [one] = [two]你会看到:
match (=) failed
code: [one] = [two]
right: [2]记住assert不会根据表达式更改其语义。换句话说,表达式仍然需要返回一个真实的值。例如,以下操作将失败:
assert nil = some_function_that_returns_nil()即使匹配成功,assert仍然期待一个真值。在这种情况下,只需使用Kernel.==/2或Kernel.match?/2...
assert(value, message)
断言value为true,否则显示给定的message。
实例
assert false, "it will never be true"assert_in_delta(value1, value2, delta, message \ nil)
断言value1与value2不超过delta。
实例
assert_in_delta 1.1, 1.5, 0.2
assert_in_delta 10, 15, 4assert_raise(exception, function)
断言exception在function执行期间引发。返回救出的异常,否则失败。
实例
assert_raise ArithmeticError, fn ->
1 + "test"
endassert_raise(exception, message, function)
实例
assert_raise ArithmeticError, "bad argument in arithmetic expression", fn ->
1 + "test"
end
assert_raise RuntimeError, ~r/^today's lucky number is 0.+!$/, fn ->
raise "today's lucky number is 0.9444502650782908!"
endassert_receive(pattern,timeout \ Application.fetch_env!(:ex_unit,:assert_receive_timeout),failure_message \ nil)(宏)
断言消息匹配pattern在timeout周期,以毫秒为单位指定。
不像assert_received,它有一个默认的timeout100毫秒。
大模式参数必须是匹配模式。用... failure_message如果消息匹配模式没有收到。
实例
assert_receive :hello反对更大的超时:
assert_receive :hello, 20_000您还可以匹配特定的模式:
assert_receive {:hello, _}
x = 5
assert_receive {:count, ^x}assert_received(pattern,failure_message \ nil)(宏)
断言pattern已收到消息匹配并且位于当前进程的邮箱中。
大pattern参数必须是匹配模式。用...failure_message如果消息匹配pattern没有收到。
超时设置为0,因此没有等待时间。
实例
send self(), :hello
assert_received :hello
send self(), :bye
assert_received :hello, "Oh No!"
** (ExUnit.AssertionError) Oh No!
Process mailbox:
:bye您还可以匹配特定的模式:
send self(), {:hello, "world"}
assert_received {:hello, _}catch_error(表达式)(宏)
断言expression会导致错误。返回错误或失败。
实例
assert catch_error(error 1) == 1catch_exit(表达式)(宏)
断言expression会退出。返回退出状态/消息,否则失败。
实例
assert catch_exit(exit 1) == 1catch_throw(表达式)(宏)
断言expression会抛出一个价值。返回抛出的值,否则失败。
实例
assert catch_throw(throw 1) == 1flunk(message \ "Flunked!")
flunk(String.t) :: no_return没有收到消息。
实例
flunk "This should raise an error"refute(assertion) (macro)
一个否定的断言,期望表达式是false或nil...
记住refute不改变给定表达式的语义。换言之,下列情况将失败:
refute {:ok, _} = some_function_that_returns_error_tuple()上面的代码将失败,因为=运算符在边不匹配时总是失败,并且refute/2不会改变它。
上面写出驳斥的正确方法是使用Kernel.match?/2:
refute match? {:ok, _}, some_function_that_returns_error_tuple()实例
refute age < 0refute(value, message)
断言value是nil或false(即value非真)。
实例
refute true, "This will obviously fail"refute_in_delta(value1, value2, delta, message \ nil)
断言value1和value2不在delta范围内。
如果您提供message,有关这些值的信息将自动附加到它。
实例
refute_in_delta 1.1, 1.2, 0.2
refute_in_delta 10, 11, 2refute_receive(pattern,timeout \ Application.fetch_env!(:ex_unit,:refute_receive_timeout),failure_message \ nil)(宏)
断言pattern在timeout指定的时间段内没有收到消息匹配(并且不会被接收),以毫秒为单位。
模式参数必须是匹配模式。 如果收到消息匹配模式,则使用failure_message进行擦除。
实例
refute_receive :bye在明确超时的情况下收到的反驳:
refute_receive :bye, 1000refute_received(pattern,failure_message \ nil)(宏)
断言pattern没有收到消息匹配(即它不在当前进程的邮箱中)。
模式参数必须是匹配模式。 如果收到消息匹配模式,则使用failure_message进行擦除。
超时设置为0,因此没有等待时间。
实例
send self(), :hello
refute_received :bye
send self(), :hello
refute_received :hello, "Oh No!"
** (ExUnit.AssertionError) Oh No!
Process mailbox:
:bye本文档系腾讯云开发者社区成员共同维护,如有问题请联系 cloudcommunity@tencent.com

