Jos*_*lim 87
不,没有办法通过ExUnit测试它们.
我个人避免测试私有函数,因为通常您最终会测试实现而不是行为,并且一旦您需要更改代码,这些测试就会失败.相反,我通过公共函数测试预期的行为,以小的,一致的块来打破它们.
Mic*_*hop 13
在模块定义中,您可以使用@compile指令仅在测试环境中导出私有函数.
defmodule Foo do
@compile if Mix.env == :test, do: :export_all
# This will be exported for tests
defp bar() do
... code ...
end
end
Run Code Online (Sandbox Code Playgroud)
可以使用宏根据环境更改函数的可见性:
defmacro defp_testable(head, body \\ nil) do
if Mix.env == :test do
quote do
def unquote(head) do
unquote(body[:do])
end
end
else
quote do
defp unquote(head) do
unquote(body[:do])
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
然后,您可以将函数公开给测试,如下所示:
defp_testable myfunc do
...
end
Run Code Online (Sandbox Code Playgroud)
我建议谨慎使用这个问题,理由是José的回答.它不能替代测试模块的外部行为.不过,它在某些情况下可能很有价值.
(来源)