Erlang EUnit测试模块依赖于库应用程序

时间:2012-11-09 15:07:04

标签: erlang rebar 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 个答案:

答案 0 :(得分:1)

我可以通过rebar compile eunit skip_deps=true来实现这一点。

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

答案 1 :(得分:0)

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

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

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