【问题标题】:How to use absolute import paths when writing tests for a specific module为特定模块编写测试时如何使用绝对导入路径
【发布时间】:2019-02-27 21:38:08
【问题描述】:

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

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

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

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

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

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

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

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

如果我对上述任何一点有误,请指出,因为我很茫然。在我看来,NodeJS 并没有提供本地方式来导入具有绝对路径的 CommonJS 模块。

【问题讨论】:

  • @Troopers 嘿,我已经用一些 cmets 解决了可能的重复问题
  • In my answer, babel 不用作转译器(除非您想使用 es6 模块语法)它仅用作加载器与 babel-plugin-module-resolver 解析路径
  • 所以您的意思是使用babel 和babel-plugin-module-resolver 根本不会更改我的代码,因此不会生成更多的Javascript 文件?另外,如果是这种情况,即这个插件只会增强babel,我将不得不使用babel而不是node来运行我的项目,对吧?
  • 您可以使用babel-register 即时编译,而不是在构建时使用 babel 作为编译器。您的最后一个问题毫无意义:babel 是转译器,node 是跑步者。您的项目始终在 node 上运行,但如果您使用 babel,源代码会有所不同

标签: node.js ecmascript-6 mocha.js


【解决方案1】:

您可以使用wavy npm 包。

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

【讨论】:

    【解决方案2】:

    假设您需要一个位于项目根目录的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 一起使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-10
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-27
      • 2014-10-14
      • 2020-12-30
      相关资源
      最近更新 更多