Подтвердить что ты не робот

Есть ли способ проверить частные функции в модулях ExUnit Elixir?

Функции, определенные defp, не экспортируются, поэтому я не могу их выполнять в других местах, кроме модуля.

4b9b3361

Ответ 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

Я рекомендую использовать это с осторожностью по причинам, указанным в ответе Жозе. Это не заменяет проверку внешнего поведения модуля. Однако это может быть полезно в определенных сценариях.

(Источник)