无法模拟 ESM 模块 mocha 中导入的函数

Can't mock imported function in ESM Modules mocha

提问人:Jay 提问时间:11/10/2023 更新时间:11/15/2023 访问量:26

问:

因此,我一直在尝试为使用对 DB、redis 等进行外部调用的文件模拟导入函数。因此,我只能隔离使用该函数的类的方法。

在生产中,我们使用的是 Node v14,假设没有办法更新应用程序的版本。

因此,我需要做的是:

// Imported function
export const functionToBeReplaced = () => {};


// Class that I am trying to write unit tests for
import {functionToBeReplaced} from 'a/long/path/to/function';

Class A {

   testMethod(...args) {
       // Some business logic to test
       
       // result of method should be passed here
       functionToBeReplaced(result);
       // Some other business logic
       return someOtherResult;
   }
}

我尝试过使用 esmock 等库,但由于我们使用的是 NodeJS 14 版本,因此会抛出错误

export const mockedClass = await esmock('a/path/to/class', {
  'a/long/path/to/function': {
    functionToBeReplaced() {
    },
  },
}, {});


The requested module 'node:module' does not provide an export named 'isBuiltin'

似乎唯一的解决方法是将 NodeJS 版本提升到 16,但由于其他一些错误,我们不能只升级版本

此外,我还尝试使用诸如proxyquire之类的库,但是由于我们在package.json中指定了proxyquire,因此实际上并不想与ESM一起使用type: module

我们使用 mocha 作为测试框架,并带有这些启动选项

mocha --config=./.mocharc-dev.json --exit --es-module-specifier-resolution=node --experimental-modules src/**/*.test.js

.mocharc-dev.json

{
  "diff": true,
  "extension": [
    "js"
  ],
  "package": "./package.json",
  "slow": 75,
  "timeout": 20000,
  "ui": "bdd",
  "recursive": true,
  "exit": true,
  "env" : "dotenv_config_path=./.dev-env",
  "require": "dotenv/config"
}

有没有其他方法可以使用 NodeJS v14 和 mocha 模拟 ESM 模块中导入的函数?

节点.js 测试 模拟 mocha.js es6模块

评论

0赞 Jay 11/15/2023
因此,解决这个问题的方法只是将 esmock 版本降级到 <2.0.0

答: 暂无答案