Функции, заданные defp
, не экспортируются, поэтому я не могу выполнить их в местах, отличных от модуля.Есть ли способ проверить частные функции в модулях ExUnit Elixir?
ответ
Нет, нет возможности протестировать их через ExUnit.
Я лично избегаю проверки частных функций, потому что, как правило, вы заканчиваете тестирование, а не поведение, и те тесты терпят неудачу, как только вам нужно изменить код. Вместо этого я проверяю ожидаемое поведение через публичные функции, разбивая их небольшими непротиворечивыми фрагментами.
FYI, это хороший совет, независимо от языка или библиотеки тестирования. –
Я не согласен с уважением: Есть два способа проверить. На a beha – lab419
извините, это прервало редактирование этого. В глобальном масштабе согласитесь, но чувствуйте, что некоторые частные функции могут извлечь пользу из тестов для целей рефакторинга. – lab419
В определении вашего модуля вы можете указать директиву @compile
для экспорта ваших личных функций только в тестовую среду.
defmodule Foo do
@compile if Mix.env == :test, do: :export_all
# This will be exported for tests
defp bar() do
... code ...
end
end
Обновление: это выдает предупреждение в Elixir 1.5, поэтому это может быть не самый лучший способ. –
Можно изменить видимость функции в зависимости от окружающей среды с помощью макроса:
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
I рекомендуем использовать это с осторожностью по причинам, указанным в ответе Жозе. Это не заменяет проверку внешнего поведения модуля. Однако это может быть полезно в определенных сценариях.
(Source)
Уход! Это работает, когда 'myfunc' принимает аргументы? – TalkLittle
@TalkLittle Действительно. Макрос влияет только на видимость и оставляет параметры/тело неизменным. – acj
- 1. Elixir проверить, вызвана ли функция из теста ExUnit?
- 2. Есть ли способ проверить арность функции в Elixir?
- 3. Elixir testing - ExUnit - Повторяющиеся экземпляры данных
- 4. Есть ли способ увидеть исходные функции в модулях Python 3?
- 5. Есть ли способ прокомментировать строки в функции в Elixir
- 6. Есть ли способ иметь частные функции в общедоступных чертах?
- 7. Есть ли способ перебрать все аргументы, переданные функции в Elixir?
- 8. В ExUnit Elixir, можно ли просто запустить один тест?
- 9. Elixir ExUnit: испытуемый модуль не доступен
- 10. Есть ли способ проверить правильность функции mpz_mul?
- 11. Есть ли эквивалент Elixir функции Rails `try`?
- 12. Есть ли способ обойти круговые зависимости в модулях Maven?
- 13. Есть ли способ проверить, есть ли хост?
- 14. Есть ли «частные» серверные методы в Meteor?
- 15. Есть ли способ проверить, вызваны ли все определенные функции?
- 16. Есть ли способ проверить, истинна ли функция внутри другой функции?
- 17. Как вы определяете константы в модулях Elixir?
- 18. Есть ли способ доступа к объекту «export» в модулях TypeScript?
- 19. Есть ли способ проверить, открыт ли файл?
- 20. Есть ли аналог этой функции в стандартных модулях Python?
- 21. Есть ли способ проверить подпись функции в Python?
- 22. Есть ли способ проверить элемент в XCTest, кроме функции .exists?
- 23. Есть ли способ проверить unique_together?
- 24. Есть ли способ проверить метаданные?
- 25. ExUnit mock sequence
- 26. Есть ли способ сопоставить первые n символов в строке elixir
- 27. Есть ли способ измерить сходство кода в Elixir?
- 28. Есть ли способ проверить, работает ли камень? Или способ увидеть, какие функции у него есть
- 29. Elixir Pry не может выполнять частные методы?
- 30. Есть ли способ использовать локальные переменные во всех модулях?
Интересно, если можно было бы написать макрос, который расширяется в 'defp' в DEV и PROD Смешать среды, и' def' в тестовой среде? – TalkLittle
@TalkLittle Да, это возможно. См. Мой ответ ниже. – acj