ExUnit.Assertions
This module contains a set of assertion functions that are imported by default into your test cases.
In general, a developer will want to use the general assert
macro in tests. This macro introspects your code and provides good reporting whenever there is a failure. For example, assert some_fun() == 10
will fail (assuming some_fun()
returns 13
):
Comparison (using ==) failed in: code: some_fun() == 10 left: 13 right: 10
This module also provides other convenience functions like assert_in_delta
and assert_raise
to easily handle other common cases such as checking a floating-point number or handling exceptions.
Summary
Functions
- assert(assertion)
-
Asserts its argument is a truthy value
- assert(value, message)
-
Asserts
value
istrue
, displaying the givenmessage
otherwise - assert_in_delta(value1, value2, delta, message \\ nil)
-
Asserts that
value1
andvalue2
differ by no more thandelta
- assert_raise(exception, function)
-
Asserts the
exception
is raised duringfunction
execution. Returns the rescued exception, fails otherwise - assert_raise(exception, message, function)
-
Asserts the
exception
is raised duringfunction
execution with the expectedmessage
, which can be aRegex
or an exactString
. Returns the rescued exception, fails otherwise - assert_receive(pattern, timeout \\ Application.fetch_env!(:ex_unit, :assert_receive_timeout), failure_message \\ nil)
-
Asserts that a message matching
pattern
was or is going to be received within thetimeout
period, specified in milliseconds - assert_received(pattern, failure_message \\ nil)
-
Asserts that a message matching
pattern
was received and is in the current process’ mailbox - catch_error(expression)
-
Asserts
expression
will cause an error. Returns the error or fails otherwise - catch_exit(expression)
-
Asserts
expression
will exit. Returns the exit status/message or fails otherwise - catch_throw(expression)
-
Asserts
expression
will throw a value. Returns the thrown value or fails otherwise - flunk(message \\ "Flunked!")
-
Fails with a message
- refute(assertion)
-
A negative assertion, expects the expression to be
false
ornil
- refute(value, message)
-
Asserts
value
isnil
orfalse
(that is,value
is not truthy) - refute_in_delta(value1, value2, delta, message \\ nil)
-
Asserts
value1
andvalue2
are not withindelta
- refute_receive(pattern, timeout \\ Application.fetch_env!(:ex_unit, :refute_receive_timeout), failure_message \\ nil)
-
Asserts that a message matching
pattern
was not received (and won’t be received) within thetimeout
period, specified in milliseconds - refute_received(pattern, failure_message \\ nil)
-
Asserts a message matching
pattern
was not received (i.e. it is not in the current process’ mailbox)
Functions
assert(assertion) (macro)
Asserts its argument is a truthy value.
assert
introspects the underlying expression and provides good reporting whenever there is a failure. For example, if the expression uses the comparison operator, the message will show the values of the two sides. The assertion
assert 1 + 2 + 3 + 4 > 15
will fail with the message:
Assertion with > failed code: 1 + 2 + 3 + 4 > 15 left: 10 right: 15
Similarly, if a match expression is given, it will report any failure in terms of that match. Given
assert [1] = [2]
you’ll see:
match (=) failed code: [1] = [2] right: [2]
Keep in mind that assert
does not change its semantics based on the expression. In other words, the expression is still required to return a truthy value. For example, the following will fail:
assert nil = some_function_that_returns_nil()
Even though the match works, assert
still expects a truth value. In such cases, simply use Kernel.==/2
or Kernel.match?/2
.
assert(value, message)
Asserts value
is true
, displaying the given message
otherwise.
Examples
assert false, "it will never be true"
assert_in_delta(value1, value2, delta, message \\ nil)
Asserts that value1
and value2
differ by no more than delta
.
This difference is inclusive, so the test will pass if the difference and the delta
are equal.
Examples
assert_in_delta 1.1, 1.5, 0.2 assert_in_delta 10, 15, 2 assert_in_delta 10, 15, 5
assert_raise(exception, function)
Asserts the exception
is raised during function
execution. Returns the rescued exception, fails otherwise.
Examples
assert_raise ArithmeticError, fn -> 1 + "test" end
assert_raise(exception, message, function)
Asserts the exception
is raised during function
execution with the expected message
, which can be a Regex
or an exact String
. Returns the rescued exception, fails otherwise.
Examples
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.24703648603716122!" end
assert_receive(pattern, timeout \\ Application.fetch_env!(:ex_unit, :assert_receive_timeout), failure_message \\ nil) (macro)
Asserts that a message matching pattern
was or is going to be received within the timeout
period, specified in milliseconds.
Unlike assert_received
, it has a default timeout
of 100 milliseconds.
The pattern
argument must be a match pattern. Flunks with failure_message
if a message matching pattern
is not received.
Examples
assert_receive :hello
Asserts against a larger timeout:
assert_receive :hello, 20_000
You can also match against specific patterns:
assert_receive {:hello, _} x = 5 assert_receive {:count, ^x}
assert_received(pattern, failure_message \\ nil) (macro)
Asserts that a message matching pattern
was received and is in the current process’ mailbox.
The pattern
argument must be a match pattern. Flunks with failure_message
if a message matching pattern
was not received.
Timeout is set to 0, so there is no waiting time.
Examples
send self(), :hello assert_received :hello send self(), :bye assert_received :hello, "Oh No!" ** (ExUnit.AssertionError) Oh No! Process mailbox: :bye
You can also match against specific patterns:
send self(), {:hello, "world"} assert_received {:hello, _}
catch_error(expression) (macro)
Asserts expression
will cause an error. Returns the error or fails otherwise.
Examples
assert catch_error(error 1) == 1
catch_exit(expression) (macro)
Asserts expression
will exit. Returns the exit status/message or fails otherwise.
Examples
assert catch_exit(exit 1) == 1
catch_throw(expression) (macro)
Asserts expression
will throw a value. Returns the thrown value or fails otherwise.
Examples
assert catch_throw(throw 1) == 1
flunk(message \\ "Flunked!")
flunk(String.t()) :: no_return()
Fails with a message.
Examples
flunk "This should raise an error"
refute(assertion) (macro)
A negative assertion, expects the expression to be false
or nil
.
Keep in mind that refute
does not change the semantics of the given expression. In other words, the following will fail:
refute {:ok, _} = some_function_that_returns_error_tuple()
The code above will fail because the =
operator always fails when the sides do not match and refute/2
does not change it.
The correct way to write the refutation above is to use Kernel.match?/2
:
refute match? {:ok, _}, some_function_that_returns_error_tuple()
Examples
refute age < 0
refute(value, message)
Asserts value
is nil
or false
(that is, value
is not truthy).
Examples
refute true, "This will obviously fail"
refute_in_delta(value1, value2, delta, message \\ nil)
Asserts value1
and value2
are not within delta
.
This difference is exclusive, so the test will fail if the difference and the delta are equal.
If you supply message
, information about the values will automatically be appended to it.
Examples
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) (macro)
Asserts that a message matching pattern
was not received (and won’t be received) within the timeout
period, specified in milliseconds.
The pattern
argument must be a match pattern. Flunks with failure_message
if a message matching pattern
is received.
Examples
refute_receive :bye
Refute received with an explicit timeout:
refute_receive :bye, 1000
refute_received(pattern, failure_message \\ nil) (macro)
Asserts a message matching pattern
was not received (i.e. it is not in the current process’ mailbox).
The pattern
argument must be a match pattern. Flunks with failure_message
if a message matching pattern
was received.
Timeout is set to 0, so there is no waiting time.
Examples
send self(), :hello refute_received :bye send self(), :hello refute_received :hello, "Oh No!" ** (ExUnit.AssertionError) Oh No! Process mailbox: :bye
© 2012 Plataformatec
Licensed under the Apache License, Version 2.0.
https://hexdocs.pm/ex_unit/1.6.6/ExUnit.Assertions.html