非常教程

Elixir 1.5参考手册

ExUnit

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)

断言value1value2不超过delta

assert_raise(exception, function)

断言exceptionfunction失效。返回获救的异常,否则失败。

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)

一个否定的断言,期望表达式是falsenil

refute(value, message)

断言valuenilfalse(即value非真)

refute_in_delta(value1, value2, delta, message \ nil)

断言value1value2不在delta范围内

refute_receive(pattern,timeout \ Application.fetch_env!(:ex_unit,:refute_receive_timeout),failure_message \ nil)

断言patterntimeout指定的时间段内没有收到消息匹配(并且不会被接收),以毫秒为单位

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.==/2Kernel.match?/2...

assert(value, message)

断言valuetrue,否则显示给定的message

实例

assert false, "it will never be true"

assert_in_delta(value1, value2, delta, message \ nil)

断言value1value2不超过delta

实例

assert_in_delta 1.1, 1.5, 0.2
assert_in_delta 10, 15, 4

assert_raise(exception, function)

断言exceptionfunction执行期间引发。返回救出的异常,否则失败。

实例

assert_raise ArithmeticError, fn ->
  1 + "test"
end

assert_raise(exception, message, function

断言exceptionfunction使用预期的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)(宏)

断言消息匹配patterntimeout周期,以毫秒为单位指定。

不像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) == 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)

一个否定的断言,期望表达式是falsenil...

记住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)

断言valuenilfalse(即value非真)。

实例

refute true, "This will obviously fail"

refute_in_delta(value1, value2, delta, message \ nil)

断言value1value2不在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)(宏)

断言patterntimeout指定的时间段内没有收到消息匹配(并且不会被接收),以毫秒为单位。

模式参数必须是匹配模式。 如果收到消息匹配模式,则使用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
Elixir 1.5

Elixir 基于 Erlang 虚拟机的函数式、面向并行,是一种较好的编程语言。它以 Erlang 为基础,支持分布式、高容错、实时应用程序的开发。

主页 https://elixir-lang.org/
源码 https://github.com/elixir-lang/elixir
版本 1.5
发布版本 1.5.2