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

Posted

技术标签:

【中文标题】为特定模块编写测试时如何使用绝对导入路径【英文标题】: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提供的解决方案:

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

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

【问题讨论】:

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

您可以使用wavy npm 包。

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

【讨论】:

【参考方案2】:

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

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

这样您的代码编辑器的自动完成功能也可以使用。不再有全局变量污染、长期相对导入、不依赖环境变量,最棒的是,它可以与 pm2 和 nodemon 一起使用。

【讨论】:

以上是关于为特定模块编写测试时如何使用绝对导入路径的主要内容,如果未能解决你的问题,请参考以下文章

查找导入模块的绝对路径

使用react + webpack时如何使用绝对路径导入自定义scss?

使用 git 子模块时如何处理绝对导入

Python程序加密打包

使用 `importlib` 从 Python 模块中仅导入特定类

模块的绝对导入相对导入