gpt4 book ai didi

node.js - 在 Mocha 测试之间重新导入模块

转载 作者:太空宇宙 更新时间:2023-11-04 00:10:18 25 4
gpt4 key购买 nike

在我的 Node/TypeScript Express 应用程序中,我将配置设置存储在 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();

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

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

我尝试过使用decache并将以下内容添加到 afterEach 中:

decache('./config');

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

我做错了什么?

最佳答案

如果在 decache('settings.json') 之后重新评估 require('settings.json'),像 decache 这样的缓存管理包应该可以在这种情况下工作),即调用Config.get()

由于修改的是settings.json模块对象,因此应该恢复它。 decache 应直接影响应取消缓存的包,即 settings.json。如果 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 模块的另一种方法是直接修补模块对象。由于根据规范,模块对象应该是导出的只读反射(reflect)。预计转译器(包括 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');
});

关于node.js - 在 Mocha 测试之间重新导入模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50002712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com