为特定模块编写测试时如何使用绝对导入路径

Chr*_*ris 5 mocha.js node.js ecmascript-6

我正在开发一个 NodeJS (v. 8.12.0, EcmaScript 6) 项目,其项目结构类似于:

project_root/
    src/
        utils/
            protocol_messages/
                helpers.js
    tests/
        unit/
            utils/
                protocol_messages/
                    helpers.js
Run Code Online (Sandbox Code Playgroud)

我正在使用 Mocha 作为测试框架编写测试。

问题
helpers.jsunder 中tests/unit/utils/protocol_messages/,导入被测模块的正确方法是什么?

详细说明:
我想避免使用相对路径:require('../../../../../src/utils/protocol_messages/helpers')
它有效,但很丑陋,如果项目结构发生变化,我也必须重写测试导入。

(我是 Javascript 的新手,所以我可能做错了几件事。)

更新此问题中
提供的解决方案:

  1. require.main.require:在对此答案的评论中,“如果代码包含像 Mocha 测试这样的单元测试,则此解决方案将不起作用”
  2. 将我的 utils 提取到节点模块对我来说没有意义,因为代码非常特定于应用程序。
  3. node_modulessrc/的 NodeJS 项目的项目根目录下有一个额外的东西似乎没有意义。
  4. 当我只使用 NodeJS 中可用的功能并编写 CommonJS 项目时,使用 Javascript 转译器似乎有点矫枉过正。

如果我在以上任何一点上有错误,请指出,因为我不知所措。在我看来,NodeJS 没有提供使用绝对路径导入 CommonJS 模块的本机方式。

Raf*_*den 1

您可以使用wavy npm 包。

这个模块可以让你将 require('../../../../foo') 之类的东西变成 require('~/foo') 之类的东西。它的工作方式是在安装后它在 app/node_modules/~ 中创建一个符号链接以指向 app/