tutorial - elixir sinonimo
¿Hay alguna forma de probar funciones privadas en módulos en ExUnit of Elixir? (3)
Las funciones definidas por defp
no se exportan, por lo que no puedo ejecutarlas en otros lugares que no sean el módulo.
En la definición de su módulo, puede una directiva @compile
para exportar sus funciones privadas solo en el entorno de prueba.
defmodule Foo do
@compile if Mix.env == :test, do: :export_all
# This will be exported for tests
defp bar() do
... code ...
end
end
Es posible cambiar la visibilidad de una función dependiendo del entorno utilizando una macro:
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
Luego puedes exponer las funciones a tus pruebas de la siguiente manera:
defp_testable myfunc do
...
end
Recomiendo usar esto con moderación por las razones dadas en la respuesta de José. No es un sustituto para probar el comportamiento externo de un módulo. Sin embargo, puede ser valioso en ciertos escenarios.
( Source )
No, no hay forma de probarlos a través de ExUnit.
Personalmente evito probar las funciones privadas porque generalmente terminas probando la implementación en lugar del comportamiento y esas pruebas fallan tan pronto como necesitas cambiar el código. En cambio, pruebo el comportamiento esperado a través de las funciones públicas, dividiéndolos en partes pequeñas y consistentes.