Node.js:如何在自定义测试运行程序中导入测试文件

Node.js:如何在自定义测试运行程序中导入测试文件,node.js,Node.js,我正在尝试创建自己的定制测试框架,以便于学习。测试文件按以下方式编写 import { somemethod } from './some/module' test(/I click on a button)/, () => { browser.get("someSelector").should("have.text",somemethod()); }); I用户要求(文件)加载测试文件。但它抛出错误SyntaxError:Unexpected token{ 对于测试文件中的im

我正在尝试创建自己的定制测试框架,以便于学习。测试文件按以下方式编写

import { somemethod } from './some/module'

test(/I click on a button)/, () => {
  browser.get("someSelector").should("have.text",somemethod());
});
I用户
要求(文件)
加载测试文件。但它抛出错误
SyntaxError:Unexpected token{
对于测试文件中的import语句,我使用的是NodeJSVersion11.15

如果我切换到节点v13.14并在my package.json中定义
“type”:“module”
,那么它不允许我使用
require(file)
加载测试文件或包中的任何模块


考虑到用户可能正在使用
import
require
导入模块,我如何导入测试文件?

这个答案非常经验性。。。 考虑到它使用规范的commonjs方法工作,您可以尝试使用较新版本的NODE(目前我将使用14)对其进行调试。为此,我建议您使用像NVM这样的节点版本管理器,以便您可以轻松地在节点版本之间切换,并测试不同节点安装之间的差异。 使用npm init创建一个具有单个依赖项的最小项目,使用
.mjs
扩展保存索引,然后尝试导入上述依赖项。如果您能够使用该最小环境导入该依赖项,则可以归咎于您以前的节点或配置,或两者。 目前,您只需创建一个小的2个文件项目来重现这个问题。看起来您当前的节点不考虑“代码>”类型:“模块”< /代码>配置,并以其经典方式运行一切。

关于你的评论

据我所知,
import
甚至可以在您的代码中使用,而不仅仅是在开始时:

(异步()=>{
如果(某件事){
//导入副作用模块
等待导入('/modules/my module.js');
}
})();

此外,您还可以使用以下配置尝试Webpack:

//webpack.config.js
const nodeExternals=require('webpack-node-externals');
module.exports={
模式:"生产",,
目标:'节点',
外部:[nodeExternals()],
条目:{
“生成/输出”:“./src/index.js”
},
输出:{
路径:_dirname,
文件名:'[name].bundle.js',
libraryTarget:“commonjs2”
},
模块:{
规则:[
{
测试:/\.js$/,,
使用:{
加载器:“巴别塔加载器”,
选项:{
预设:[
['env'{
“目标”:{
“节点”:“当前”
}
}]
]
}
}
}]
}
};

使用
NodeExternals
时,您不会将节点依赖项放在捆绑包中,而只将自己的代码放在捆绑包中。其余部分请参考节点模块。您可能不希望这样做。

这个答案非常经验性。。。 考虑到它使用规范的commonjs方法工作,您可以尝试使用较新版本的NODE(目前我将使用14)对其进行调试。为此,我建议您使用像NVM这样的节点版本管理器,以便您可以轻松地在节点版本之间切换,并测试不同节点安装之间的差异。 使用npm init创建一个具有单个依赖项的最小项目,使用
.mjs
扩展保存索引,然后尝试导入上述依赖项。如果您能够使用该最小环境导入该依赖项,则可以归咎于您以前的节点或配置,或两者。 目前,您只需创建一个小的2个文件项目来重现这个问题。看起来您当前的节点不考虑“代码>”类型:“模块”< /代码>配置,并以其经典方式运行一切。

关于你的评论

据我所知,
import
甚至可以在您的代码中使用,而不仅仅是在开始时:

(异步()=>{
如果(某件事){
//导入副作用模块
等待导入('/modules/my module.js');
}
})();

此外,您还可以使用以下配置尝试Webpack:

//webpack.config.js
const nodeExternals=require('webpack-node-externals');
module.exports={
模式:"生产",,
目标:'节点',
外部:[nodeExternals()],
条目:{
“生成/输出”:“./src/index.js”
},
输出:{
路径:_dirname,
文件名:'[name].bundle.js',
libraryTarget:“commonjs2”
},
模块:{
规则:[
{
测试:/\.js$/,,
使用:{
加载器:“巴别塔加载器”,
选项:{
预设:[
['env'{
“目标”:{
“节点”:“当前”
}
}]
]
}
}
}]
}
};

使用
NodeExternals
时,您不会将节点依赖项放在捆绑包中,而只将您自己的代码放在捆绑包中。其余部分请参考node_模块。您可能不希望这样做。

它与commonjs方法一起工作吗?
const{somemethod}=require('./some/module'))
?我可以尝试一下,但这就像强迫用户只采用commonjs方法一样。限制为只测试我的项目,commonjs方法有效。但同样,测试文件中不应导入任何使用
导出的模块
语句:(我建议使用一种基本的commonjs方法来了解下面是否有其他问题。如果这样做有效,我们可以安全地开始使用es6导入使其工作。好的,如果这样做有效,我将尝试编写一种可能的方法来调试它。它是否与commonjs方法一起工作?
const{somemethod}=require('./some/mod