Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 用Jest重置单个模块_Node.js_Jestjs_Commonjs - Fatal编程技术网

Node.js 用Jest重置单个模块

Node.js 用Jest重置单个模块,node.js,jestjs,commonjs,Node.js,Jestjs,Commonjs,jest.resetModules()清除所有模块的require缓存,但是否有方法仅清除单个模块的require缓存?无法使用require.cache,因为Jest似乎绕过了它 我正在测试一个有状态的节点模块(即,它依赖于对的多个调用要求返回同一个实例这一事实)。对于我的测试,我需要重置模块的状态以测试不同的场景jest.resetModules()可以工作,但是我需要重新设置一些不需要重置的模拟模块。由于jest 24,您现在可以使用 假设您只想重置某个模块,那么您应该在jest.isol

jest.resetModules()
清除所有模块的require缓存,但是否有方法仅清除单个模块的require缓存?无法使用
require.cache
,因为Jest似乎绕过了它


我正在测试一个有状态的节点模块(即,它依赖于对
的多个调用要求
返回同一个实例这一事实)。对于我的测试,我需要重置模块的状态以测试不同的场景
jest.resetModules()
可以工作,但是我需要重新设置一些不需要重置的模拟模块。

由于jest 24,您现在可以使用

假设您只想重置某个模块,那么您应该在
jest.isolateModules
的回调中要求:

let myModule;
jest.isolateModules(() => {
  myModule = require('my-certain-module');
});

在测试文件中为某些测试模拟模块(带有工厂),为其他测试恢复模块的示例

describe("some tests", () => {
  let subject;

  describe("with mocks", () => {
    beforeAll(() => {
      jest.isolateModules(() => {
        jest.doMock("some-lib", () => ({ someFn: jest.fn() })); // .doMock doesnt hoist like .mock does when using babel-jest
        subject = require('./module-that-imports-some-lib');
      });
    });

    // ... tests when some-lib is mocked
  });

  describe("without mocks - restoring mocked modules", () => {
    beforeAll(() => {
      jest.isolateModules(() => {
        jest.unmock("some-lib");
        subject = require('./module-that-imports-some-lib');
      });
    });

    // ... tests when some-lib is NOT mocked

  });
});

从源头上看,目前这是不可能的。完全空白
\u moduleRegistry
,您无法从测试上下文中访问它。我想说,它需要一个新的方法添加到上下文中,可以从注册表中删除单个模块。我建议在上打开并发布,希望他们能够使用此功能更新jest。如果有意义,您可以隔离您的有状态模块,并单独使用
resetModules()
对其进行测试。也许您可以这样加载单个模块:
jest.mock('../moduleName',()=>{const myModule importFresh('/path/to/module')},{virtual:true},);
?这将允许您加载模块的新副本,从而有效地为您的测试目的重置模块。
importFresh
来自于遵循此线程,似乎它仍然是一个开放的问题/改进。此外,对于作用域模块初始化,还有一个开放的PR。请检查此处:是否有足够成熟和可读的内容现在使用y…Jest创建自己的
require
钩子这主要用于保持全局require缓存干净并避免副作用。从您正在做的事情来看,您只需要模拟您想要使用的模块,然后确保在
description
块末尾清除它,您永远不应该离开mock module如果你正在正确地设置和拆除你的模拟,你不应该遇到这个问题。你能提供一个更好的例子吗?我们能得到一个扩展的例子吗?这类似于jest文档,它没有清楚地说明发生了什么或如何使用它。非常感谢!