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

时间:2018-09-24 11:22:02

标签: node.js ecmascript-6 mocha

我正在研究NodeJS(8.1.2版,EcmaScript 6)项目,该项目的结构类似于:

project_root/
    src/
        utils/
            protocol_messages/
                helpers.js
    tests/
        unit/
            utils/
                protocol_messages/
                    helpers.js

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

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

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

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

更新
this question中提供的解决方案:

  1. require.main.require:在对this answer的评论中,“如果代码包含单元测试(如Mocha测试),则此解决方案将不起作用”。
  2. 将我的utils提取到一个节点模块对我来说没有意义,因为代码是非常特定于应用程序的。
  3. 在我的NodeJS项目的node_modules项目根下有一个额外的src/似乎没有道理。
  4. 当我仅使用NodeJS中可用的功能并编写CommonJS项目时使用Javascript编译器似乎有点过头。

如果我对以上几点有误解,请指出,因为我很茫然。在我看来,NodeJS并未提供原生方法来导入具有绝对路径的CommonJS模块。

2 个答案:

答案 0 :(得分:1)

假设您需要一个config.js文件,该文件出现在项目的根目录中,而该文件位于/routes/api/users/profile.js,那么您不想将其导入为../../../config.js

  1. 如下所述在项目的根目录中创建目录结构:
    • /模块
      • index.js
      • package.json
  2. 模块/index.js
    module.exports.config = require('../config.js')
    
  3. 模块/package.js
    {
        "name": "modules",
        "main": "index.js",
        "version": "1.0.0",
        "dependencies": {}
    }
    
  4. 现在运行
    npm install ./Modules
    
  5. /routes/api/users/profile.js
    const { config } = require('modules')
    

这样,代码编辑器的自动完成功能也将起作用。不再有全局变量污染,相对较长的进口,不依赖环境变量的问题,而且最好的部分是,它将与pm2和nodemon一起使用。

答案 1 :(得分:0)

您可以使用wavy npm软件包。

  

该模块使您可以将require('../../../../ foo')之类的内容转换为   require('〜/ foo')。它的工作方式是在安装后它在app / node_modules /〜中创建一个符号链接以指向app /