node.js - Node.js:如何在自定义测试运行器中导入测试文件
问题描述
我正在尝试创建自己的自定义测试框架以用于学习目的。测试文件的编写方式如下
import { somemethod } from './some/module'
test(/I click on a button)/, () => {
browser.get("someSelector").should("have.text",somemethod());
});
我用户require(file)
加载测试文件。但它会SyntaxError: Unexpected token {
在测试文件中为 import 语句抛出错误。我正在使用节点 js 版本 11.15。
如果我切换到节点 v13.14 并"type": "module"
在我的 package.json 中定义,那么它不会让我require(file)
用来加载测试文件或我的包中的任何模块。
import
考虑到用户可能正在使用or导入模块,我该如何导入测试文件require
?
解决方案
这个答案是非常经验性的......考虑到它使用规范的 commonjs 方法工作,您可以尝试使用更新版本的 NODE 来调试它(目前我会使用 14)。为此,我建议您使用像 NVM 这样的节点版本管理器,这样您就可以轻松地在节点版本之间切换并测试不同节点安装之间的差异。使用 npm init 创建一个具有单个依赖项的最小项目,使用.mjs
扩展保存索引并尝试导入上述依赖项。如果您能够在该最小环境中导入该依赖项,您可以责怪您以前的节点或您的配置或两者兼而有之。目前你应该只创建一个小的 2 个文件项目来重现问题。看来您当前的节点不考虑"type": "module"
配置并以经典方式运行所有内容。
关于你的评论......
据我所知import
,甚至可以在您的代码中使用,而不仅仅是在开始时:
(async () => {
if (somethingIsTrue) {
// import module for side effects
await import('/modules/my-module.js');
}
})();
来自https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import
此外,您可以尝试使用以下配置的 Webpack:
// webpack.config.js
const nodeExternals = require('webpack-node-externals');
module.exports = {
mode: 'production',
target: 'node',
externals: [nodeExternals()],
entry: {
'build/output': './src/index.js'
},
output: {
path: __dirname,
filename: '[name].bundle.js',
libraryTarget: 'commonjs2'
},
module: {
rules: [
{
test: /\.js$/,
use: {
loader: 'babel-loader',
options: {
presets: [
['env', {
'targets': {
'node': 'current'
}
}]
]
}
}
}]
}
};
与NodeExternals
您一起,不要将您的节点依赖项放入捆绑包中,而仅将您自己的代码放入其中。其余的请参考 node_modules。你可能不想要那个。
推荐阅读
- python - 在 conda 环境中安装时如何修复 azureml-sdk 中的 ModuleNotFoundError
- swift4 - 中心 NSAttributed 字符串到图像 NSTextAttachment
- android - 使用 Fuel 发送带有 body 的 GET 请求
- git - 具有多个分支的 Git 存储库模板的最佳方法?
- javascript - 向多边形添加噪声的递归函数返回未定义
- node.js - CodeStar/CodeBuild Role X 信任太多服务,预计只有 1 个
- java - 使用 selenium 在 jenkins 中获取工作的构建状态
- mysql - mySql 到 PDO 片段
- java - 片段交易不通过按钮工作
- string - 在不使用 parseInt 或 toString 的情况下,编写一个将二进制字符串转换为数字的函数