我有一个中等版本的应用程序。我最近在发布版本的库应用程序中重构了一些常用功能。每当测试需要库应用程序的任何内容时,这使得我的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
(读:它是真实的 - 世界对应物)做了一些非常简单的事情。)
答案 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标志。