Модуль тестирования Erlang EUnit, который зависит от приложения библиотеки
у меня есть выпуск среднего размера с несколькими приложениями. Недавно я переработал некоторые общие функции в библиотечное приложение в рамках выпуска. Это заставило мои тесты EUnit провалиться с undef
сообщения при тестировании всего, что требует применения библиотеки.
настройка выглядит примерно так:
% In apps/utils/src/utils.erl
-module(utils).
-export([foo/0]).
foo() -> "OH HAI".
затем
% In apps/some_app/src/some_app.erl
-module(some_app).
-export([bar/0]).
bar() -> io:format("foo: ~s~n", [utils:foo()]).
% unit tests for bar()
затем модульные тесты для some_app:bar()
провал. Я запускаю их с rebar eunit skip_deps=true
. Я использую skip_deps=true
потому что мой выпуск использует некоторые сторонние приложения (SQL и т. д.).
Я предполагаю, что тесты начинают сбой, потому что EUnit вызывает тестируемое приложение без его зависимостей? Есть ли способ это исправить? Я настроил .файл app для явного объявления зависимости. Он отлично работает в выпуске, и он был развернут около дня без проблем, но я буду чувствовать себя намного лучше, если смогу снова пройти тесты:)
(я мог бы использовать насмешливое приложение для гашу utils:foo/0
, и я вижу, где это было бы идеально одинаково, но это кажется излишним в данном случае, потому что utils:foo/0
(читайте: это реальный аналог) делает некоторые действительно простые вещи.)
2 ответов
я смог заставить это работать, сделав rebar compile eunit skip_deps=true
.
ключ должен иметь compile
там и я понятия не имею, почему. Я предполагаю, что шаг компиляции получает все модули в память. Я бы хотел услышать хорошее объяснение.
Я думаю ,что вы можете загрузить одно из ваших приложений, включив его в часть приложения.файл приложения, как в:
{application,yourapp
[{description,"A description"},
{vsn,"1.0.0"},
{modules,[mod1, mod2, utils]},
SNIP
или каким-то другим способом добавьте его в путь узла erlang... возможно, используя флаг-pa при запуске узла.