defmodule RaiseTest do
def testraise do
raise "This is an error"
end
end
defmodule RaiseTestTest do
use ExUnit.Case
test "assert_raise works" do
assert_raise(RuntimeError, RaiseTest.testraise )
end
end
mix test
1) test assert_raise works (RaiseTestTest)
test/raise_test_test.exs:4
** (RuntimeError) This is an error
stacktrace:
(raise_test) lib/raise_test.ex:4: RaiseTest.testraise/0
test/raise_test_test.exs:5
Finished in 0.03 seconds (0.03s on load, 0.00s on tests)
1 tests, 1 failures
My error was finally pointed out to me this morning on the elixir list and opened my eyes to a consistent flaw in my thinking about elixir. The fix of course is to actually provide a function to assert_raise, what I was actually providing was an expression that could return anything.
test "assert_raise works" do
assert_raise(RuntimeError, fn -> RaiseTest.testraise end )
end
The key misunderstanding in my head was that function when used in the elixir context actually maps to what I think of as a function reference from my years of C programming. Module functions return expressions which can be anything. The test failed because it was calling TestRaisetest to see if it returned a function it could use in the test.
When an elixir function requires a "function" as an argument, it really means a closure that can be executed.
No comments:
Post a Comment