首页 > 解决方案 > 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

标签: node.js

解决方案


这个答案是非常经验性的......考虑到它使用规范的 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。你可能不想要那个。


推荐阅读