6

我有一个带有少量应用程序的中型版本。我最近在发行版中将一些常见功能重构为库应用程序。undef这使我的 EUnit 测试在测试任何需要库应用程序的东西时 失败并显示消息。

设置是这样的:

% 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,因为我的版本使用了一些 3rd 方应用程序(SQL 等)。

我假设测试开始失败是因为 EUnit 在没有依赖关系的情况下调用被测应用程序?有没有什么办法解决这一问题?我已将 .app 文件配置为显式声明依赖项。它在发行版中运行良好,并且已经部署了大约一天,没有问题,但如果我能让测试再次通过,我会感觉好多了:)

(我可以使用一个模拟应用程序来存根utils:foo/0,我可以看到这在哪里是理想的惯用语,但在这种情况下这似乎有点矫枉过正,因为utils:foo/0(阅读:它是现实世界的对应物)做了一些非常简单的事情。)

4

2 回答 2

2

我能够通过做这个来工作rebar compile eunit skip_deps=true

关键是compile在那里,我不知道为什么。我猜想编译步骤将所有模块都放入内存。我很想听听一个很好的解释。

于 2013-11-26T22:56:19.560 回答
0

我认为您可以通过将其中一个应用程序包含在 .app 文件的应用程序部分中来加载该实用程序,如下所示:

{application,yourapp
         [{description,"A description"},
          {vsn,"1.0.0"},
          {modules,[mod1, mod2, utils]},
           SNIP

或以其他方式将其添加到 erlang 节点的路径中......也许在启动节点时使用 -pa 标志。

于 2012-11-10T21:35:47.323 回答