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

依赖于库应用程序的Erlang EUnit测试模块,erlang,rebar,eunit,Erlang,Rebar,Eunit,我有一个中等规模的发行版,有一些应用程序。我最近将一些常见的功能重构到版本中的库应用程序中。这使得每当测试任何需要库应用程序的内容时,我的EUnit测试都会失败,并显示unde消息 设置如下所示: % In apps/utils/src/utils.erl -module(utils). -export([foo/0]). foo() -> "OH HAI". 然后 然后对某些应用程序:bar()的单元测试失败。我正在使用rebar eunit skip\u deps=true运行它

我有一个中等规模的发行版,有一些应用程序。我最近将一些常见的功能重构到版本中的库应用程序中。这使得每当测试任何需要库应用程序的内容时,我的EUnit测试都会失败,并显示
unde
消息

设置如下所示:

% In apps/utils/src/utils.erl
-module(utils).

-export([foo/0]).

foo() -> "OH HAI".
然后

然后对
某些应用程序:bar()的单元测试失败。我正在使用
rebar eunit skip\u deps=true运行它们。我使用的是
skip_deps=true
,因为我的版本使用了一些第三方应用程序(SQL等)

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


(我可以用一个模拟应用程序来剔除
utils:foo/0
,我可以看出这在习惯用法上是理想的,但在这种情况下,这似乎有些过分,因为
utils:foo/0
(阅读:它是现实世界中的对应物)做了一些非常简单的事情。)

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

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

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

我可以通过执行
rebar compile eunit skip\u deps=true
来实现这一点


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

我认为这与EUnit本身无关,而是与力霸如何运行测试有关。或者是因为在使用skip_deps时,它根本不编译其他应用程序,或者因为它没有将它们添加到Erlang代码路径中,即使它们以前已经编译过。我想我需要深入研究rebar源代码来找出这个问题:/I认为
skip_deps
标志只是跳过
deps
目录中的单元测试(用于第三方内容)。从钢筋的源代码来看,
skip_deps
只是告诉钢筋跳过
deps
目录中的应用程序。该模块是另一个应用程序的一部分。它作为依赖项列在.app文件的
应用程序
部分。
modules
部分用于该应用程序引入的模块,因此不适用。不管怎样我都试过了,但还是不起作用。
{application,yourapp
         [{description,"A description"},
          {vsn,"1.0.0"},
          {modules,[mod1, mod2, utils]},
           SNIP