是的,ES6 模块 "does not provide export named"

Jest, ES6 modules "does not provide export named"

我有一个带有 CRUD API(带有 sequelize)的快速应用程序,我想用 Jest 测试它。我是单元测试的新手,所以我遵循这个 guide, recommended by Jest's website.

我遇到的问题是我的应用程序是用 ES6 模块构建的,而 Jest ES6 模块是实验性的,它似乎没有“导入”包。

我有这个测试(取自指南)

import request from 'supertest';
import app from '../app';

describe('Test the root path', () => {
    test('It should response the GET method', done => {
        request(app)
            .get('/')
            .then(response => {
                expect(response.statusCode).toBe(404);
                done();
            });
    });
});

当我启动它时(使用 NODE_OPTIONS=--experimental-vm-modules npx jest 我必须遵循这个 jest wiki page),它说

'sequelize' does not provide an export named 'DataTypes' 当我正常启动我的应用程序时(比如 npm start),它工作正常,没有任何问题。

(完整的错误日志):

(node:49576) ExperimentalWarning: VM Modules is an experimental feature. This feature could change at any time
(Use `node --trace-warnings ...` to show where the warning was created)
 FAIL  __tests__/app_test.js
  ● Test suite failed to run

    SyntaxError: The requested module 'sequelize' does not provide an export named 'DataTypes'

      at Runtime.linkAndEvaluateModule (node_modules/jest-runtime/build/index.js:779:5)
      at TestScheduler.scheduleTests (node_modules/@jest/core/build/TestScheduler.js:333:13)
      at runJest (node_modules/@jest/core/build/runJest.js:404:19)
      at _run10000 (node_modules/@jest/core/build/cli/index.js:320:7)
      at runCLI (node_modules/@jest/core/build/cli/index.js:173:3)

(和我的 Jest 配置)

// Sync object
/** @type {import('@jest/types').Config.InitialOptions} */

export default async () => {
    return {
        verbose: true,
        transform: {},
    };
};

我做错了什么吗?我应该改用 commonJS 而不是 ES6

谢谢。

这是 Jest 中的一个已知问题:#9771。据说固定在jest@28.0.0-alpha.0.

一个有趣的 hack 解决此问题的方法是从导入项目的 package.json 中删除 main 字段。