在摩卡测试之间重新导入模块

2024-03-22

在我的节点/打字稿快递应用程序中,我将配置设置存储在settings.json作为对象加载和导出的文件config.ts。每个使用配置设置的模块都会像这样导入模块:

import Config from './config';

config.ts看起来像这样(本例已简化):

class Config {
  public static get(): any {
    const settings = require('settings.json');
    return settings;
  }
}

export default Config.get();

当应用程序运行时,这一切都工作正常。但是我的摩卡测试遇到了问题。在一些测试中,我想在触发应用程序功能之前更改配置设置(例如Config.someSetting = 'someValue'),然后在运行下一个测试之前将配置设置重置回默认值。

我知道我可以手动将每个更改的配置值重置回默认值,但理想情况下我想“重新导入”config.ts模块会将所有配置设置重置为默认值。我的问题是最好的方法是什么?

我尝试过使用decache https://www.npmjs.com/package/decache并将以下内容添加到afterEach:

decache('./config');

即使我可以看到config.ts不再在 require 缓存中,Config 对象仍然存在,并且它的当前值适用于所有后续测试(config.ts没有被“重新导入”)。

我究竟做错了什么?


缓存修改包,例如decache应该在这种情况下工作,如果require('settings.json')之后重新评估decache('settings.json'), i.e. Config.get()叫做。

因为它是settings.json模块对象被修改后,应该将其恢复。decache应该直接影响应该取消缓存的包,即settings.json. If Config.get()不会被多次调用,./config'并且导入它的每个模块也应该被取消缓存。这使得利用decache在这种情况下是不合理的。

这里的问题是配置模块不适合测试。仅静态类是反模式。如果Config没有像代码所示那样导出,这也是反模式,因为它提供了一个在模块导出时不能多次使用的抽象。

为了改善这种情况,配置模块应该以能够重新评估的方式进行重构require('settings.json')在导入配置对象后使用配置对象的模块中:

export default function getConfig() {
  return require('settings.json');
}

getConfig()应始终按原样使用,不应分配const config = getConfig()在使用它的模块的顶部,这将使其不可缓存。

目前恢复原始配置的一种方法是修改它,同时保留对现有对象的引用,例如:

afterEach(() => {
  decache('./settings.json');
  Object.assign(Config, require('./settings.json'));
});

可见。 Config.get 抽象没有任何帮助。

另一种方式进入转译的ES模块是直接对模块对象进行补丁。由于根据规范,模块对象应该是导出的只读反映。预计转译器(包括 TypeScript)会相应地处理模块。这取决于应用程序的构建方式,并且可能无法在任何环境中按预期工作。

import Config from './config';
console.log(Config.foo);

应该被转译为类似的东西

Object.defineProperty(exports, "__esModule", { value: true });    
console.log(config_1.default.foo;);

这可能允许动态修改 ES 模块导出(CommonJS 模块默认导出不可能)并影响那些使用的模块部分Config并重新评估(例如,在函数内部但不在顶级模块范围内):

afterEach(() => {
  decache('./settings.json');
  const configModule = require('./config'));
  configModule.default = require('./settings.json');
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在摩卡测试之间重新导入模块 的相关文章

随机推荐