otuv
Testing for expected failure
Hi,
How would one make a test that asserts that the tested method is invalid?
If i for example want to test the following (somewhat contrived) method:
def only_valid_number(number) when is_number number do
number
end
A simple success test is trivial:
assert 5 == only_valid_number(5)
But what if I want to verify that:
assert ‘got stacktrace’ == only_valid_number(“5”)
Where I don’t really care why, just that any attempts to use it in this way will fail.
Marked As Solved
arjan
You could use flunk instead to check that the execution does not reach a certain point:
try do
only_valid_number("x")
flunk("this should not have happened")
catch
_, _ -> :ok
end
Also Liked
outlog
devonestes
This was a good idea! I’ve added it to the new version (0.15.0) and just published it to hex: https://hex.pm/packages/assertions
https://hexdocs.pm/assertions/0.15.0/Assertions.html#assert_raise/1
arjan
My suggestion was not entirely right. You could write a expect_failure macro like this:
defmodule ExpectFailure do
defmacro expect_failure(ast) do
quote do
try do
unquote(ast)
flunk("This should has crashed: " <> unquote(Macro.to_string(ast)))
rescue
e in ExUnit.AssertionError ->
raise e
_ ->
:ok
end
end
end
end
defmodule AsdfTest do
use ExUnit.Case
doctest Asdf
import ExpectFailure
def foo(x) when is_number(x) do
x + 1
end
test "expect_failure catches errors" do
expect_failure(foo("a"))
end
test "expect_failure should crash" do
assert_raise ExUnit.AssertionError, fn ->
expect_failure(foo(1))
end
end
end







