ExUnit.Assertions
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, 4
assert_raise(exception, function)
断言exception
在function
执行期间引发。返回救出的异常,否则失败。
实例
assert_raise ArithmeticError, fn ->
1 + "test"
end
assert_raise(exception, message, function)
断言exception
在function
使用预期的message
,它可以是Regex
或者是一个精确的String
返回获救的异常,否则失败。
实例
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!"
end
assert_receive(pattern,timeout \ Application.fetch_env!(:ex_unit,:assert_receive_timeout),failure_message \ nil)(宏)
断言消息匹配pattern
在timeout
周期,以毫秒为单位指定。
不像assert_received
,它有一个默认的timeout
100毫秒。
大模式参数必须是匹配模式。用... 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) == 1
catch_exit(表达式)(宏)
断言expression
会退出。返回退出状态/消息,否则失败。
实例
assert catch_exit(exit 1) == 1
catch_throw(表达式)(宏)
断言expression
会抛出一个价值。返回抛出的值,否则失败。
实例
assert catch_throw(throw 1) == 1
flunk(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 < 0
refute(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, 2
refute_receive(pattern,timeout \ Application.fetch_env!(:ex_unit,:refute_receive_timeout),failure_message \ nil)(宏)
断言pattern
在timeout
指定的时间段内没有收到消息匹配(并且不会被接收),以毫秒为单位。
模式参数必须是匹配模式。 如果收到消息匹配模式,则使用failure_message进行擦除。
实例
refute_receive :bye
在明确超时的情况下收到的反驳:
refute_receive :bye, 1000
refute_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