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