So, how can we test a private function? Should we? Let's not concern us with the latter question. Now, imagine the following:
defmodule TestableDefp do defmacro __using__() do quote do import Kernel, except: [defp: 2] import __MODULE__ end end defmacro defp(fun, body) do def_macro = if function_exported?(Mix, :env, 0) && apply(Mix, :env, [:test]), do: :def, else: :defp quote, do: Kernel.unquote(def_macro)(unquote(fun), unquote(body)) end end
This will allow us to test defp whenever we use it and only in testing mode
defmodule AModule do use TestableDefp defp a_fun(), do: :ok end
Why would you do that? I think you should not do that. There's probably a smelly code.
And now I finished an example of what not to do.