Функции, определенные defp
, не экспортируются, поэтому я не могу их выполнять в других местах, кроме модуля.
Есть ли способ проверить частные функции в модулях ExUnit Elixir?
Ответ 1
Нет, нет возможности проверить их через ExUnit.
Я лично избегаю тестирования частных функций, потому что обычно вы завершаете тестирование вместо поведения, и эти тесты терпят неудачу, как только вам нужно изменить код. Вместо этого я проверяю ожидаемое поведение через публичные функции, разбивая их на небольшие, непротиворечивые куски.
Ответ 2
В определении вашего модуля вы можете директиву @compile
экспортировать свои частные функции только в тестовой среде.
defmodule Foo do
@compile if Mix.env == :test, do: :export_all
# This will be exported for tests
defp bar() do
... code ...
end
end
Ответ 3
Можно изменить видимость функции в зависимости от среды с помощью макроса:
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
Затем вы можете открыть функции для своих тестов следующим образом:
defp_testable myfunc do
...
end
Я рекомендую использовать это с осторожностью по причинам, указанным в ответе Жозе. Это не заменяет проверку внешнего поведения модуля. Однако это может быть полезно в определенных сценариях.
(Источник)