是否可以在Enum.each中包含ExUnit.test语句

Flo*_*nt2 6 elixir

我正在尝试做这样的事情,不必手动编写一系列test块:

test_cases = %{
  "foo" => 1,
  "bar" => 2,
  "baz" => 3,
}

Enum.each(test_cases, fn({input, expected_output}) ->
  test "for #{input}" do
    assert(Mymodule.myfunction input) == expected_output
  end
end)
Run Code Online (Sandbox Code Playgroud)

但是,在运行此代码时,我得到的错误undefined function input/0就行了assert(Mymodule.myfunction input) == expected_output.

有没有办法实现我想要的?

wha*_*ide 8

是的,它是可能的,你只需要unquote两个inputexpected_output里面do你传递给块test/2.

test_cases = %{
  "foo" => 1,
  "bar" => 2,
  "baz" => 3,
}

Enum.each test_cases, fn({input, expected_output}) ->
  test "for #{input}" do
    assert Mymodule.myfunction(unquote(input)) == unquote(expected_output)
  end
end
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你在assert调用assert/1时遇到了一个parens错误Mymodule.myfunction input,而不是Mymodule.myfunction(input) == expected_output(这是你试图断言的表达式).