【发布时间】:2012-05-26 12:28:34
【问题描述】:
免责声明:这个问题的作者主要是 Erlang/OTP 的理论知识。
我有一个小型 OTP 应用程序,它通过 open_port() 在 myapp/ebin 目录中调用一些非 Erlang 可执行文件。当我运行应用程序本身时,一切顺利,可执行文件的端口已成功打开。
但是当我尝试为应用程序运行单元测试时,依赖于open_port() 的单元测试失败,因为当以EUnit 启动时,应用程序试图在myapp/.eunit/ebin 下找到可执行文件。
如何在不更改应用程序本身代码的情况下更改该行为?如何使用与运行应用程序本身相同的当前目录运行 EUnit 测试? (我的意思是更改提供可执行文件路径的代码只是为了能够运行 EUnit 并不是一个好主意)。
编辑:我遵循了 Erlang mailing list 中的建议,但 code:priv_dir(myapp_name) 返回 {error, bad_name}。
编辑:我可以看到.eunit/ 包含modulename.beam 文件,ebin/ 包含modulename.beam 文件和modulename_tests.beam 文件。现在我完全迷失了。当我运行make test 时,rebar 运行eunit 命令,该命令调用ebin/ 目录中的每个modulename_tests.beam 文件,该文件调用.eunit/ 目录中相应的modulename.beam 文件(filename:absname("") 清楚地表明modulename.beam 文件在测试期间从.eunit/ 执行)。为什么会这样?为什么我们需要从.eunit/ 目录而不是ebin/ 运行modulename.beam 文件?
为什么我们实际上需要在myapp/ebin 和myapp/.eunit/ebin 中拥有完全相同的.beam 文件?
附:我已阅读official documentation 并没有找到解决方案。
【问题讨论】:
标签: erlang erlang-otp eunit erlang-ports