Jest 模块模拟与 ECMAScript 模块

Jest Module Mock with ECMAScript Modules

提问人:lmat - Reinstate Monica 提问时间:8/17/2022 更新时间:8/18/2022 访问量:638

问:

以文档(https://jestjs.io/docs/ecmascript-modules)为指导,我写了以下内容:

package.json:

{
  "scripts": {
    "watch-test": "jest ./test --verbose --watch"
  },
  "dependencies": {
    "ethers": "^5.6.9"
  },
  "devDependencies": {
    "jest": "^28.1.3"
  },
  "jest": {
    "verbose": true,
    "transform": {}
  },
  "type": "module"
}

test/test.js:

import {jest} from '@jest/globals';
import {ethers} from 'ethers';

jest.mock('ethers', () => ({ethers: 'Hello, world!'}));
console.log(ethers);

使用以下命令执行测试:。输出是等等,但我希望它说类似.npm i && NODE_OPTIONS=--experimental-vm-modules npm run watch-test;console.log {Signer: [Getter],Wallet: [Getter],...console.log "Hello, world!"

看起来模块(或模块中的对象?)根本没有被嘲笑。我尝试将呼叫移到上方(由于开玩笑,这不应该是必需的),但这无济于事。ethersethersjest.mockimport

在使用 ECMAScript 模块配置时,如何使用 jest 模拟模块?ethers

单元 测试 JESTJS ES6-modules ecmascript-2017

评论


答:

1赞 lmat - Reinstate Monica 8/18/2022 #1

虽然吊装是在普通的 JS 中完成的,但它不是使用 ECMAScript 模块完成的,所以你必须在模拟后使用动态导入来导入它们,而不是模拟模块。import

test/test.js:

import {jest} from '@jest/globals';
jest.mock('ethers', () => ({ethers: 'Hello, world!'}));
const {ethers} = await import('ethers');

test('do it', ()=> {
    expect(ethers).toEqual("Hello, world!");
});

package.json:

{
    "scripts": {
        "watch-test": "jest ./test --verbose --watch"
    },
    "dependencies": {
        "ethers": "^5.6.9"
    },
    "devDependencies": {
        "jest": "^28.1.3"
    },
    "jest": {
        "verbose": true,
        "testMatch": [
            "<rootDir>/test/**/*.?(c)js"
        ],
        "transform" : {}
    },
    "type": "module"
}

("testMatch": "test/**"不起作用,您必须以 OR 为前缀;我不知道为什么。<rootDir>**

并按照问题中的说明调用。

这次谈话让我走上了正确的轨道:https://github.com/facebook/jest/issues/13135