Модуль тестирования 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 при запуске узла.