【问题标题】:Best way to override auto-mocks?覆盖自动模拟的最佳方法?
【发布时间】:2021-04-28 09:27:02
【问题描述】:

我需要自动模拟所有模块功能,除了我想手动模拟的那些。 我想使用 jest.mock() 的工厂参数来执行此操作,类似于 jest docs (https://jestjs.io/docs/jest-object#jestrequireactualmodulename) 中的示例,如下所示:

jest.mock('someModule', () => ({
  ...jest.requireMock('someModule'), // This doesn't work :(
  someFunction: jest.fn(() => 'someValue')
}));

我希望 jest.requireMock(moduleName) 能像 jest.requireActual(moduleName) 那样做,但最终得到 RangeError: Maximum call stack size exceeded

是否有可能以这种方式实现我的目标? 如果不是,这样做的最佳做法是什么?

开玩笑:24.9.0,ts-开玩笑:26.4.1

【问题讨论】:

    标签: jestjs ts-jest


    【解决方案1】:

    jest.mock 可以是自动的也可以是手动的,不能同时是。

    可以使用jest.createMockFromModule 创建自动模拟,然后进行扩展。这在__mocks__ 中的可重用模拟中很有用,但在测试级别通常不需要。

    除非在导入时使用模拟并且需要托管,否则每个测试套件执行此操作的方法是:

    jest.mock('someModule');
    
    beforeEach(() => {
      someModule.someFunction.mockReturnValue('someValue')
    });
    

    我希望 jest.requireMock(moduleName) 能做到这一点

    这是不应该的,因为模拟是在模拟中导入的,这会导致递归。

    【讨论】:

    • 非常感谢!在我的示例中将jest.requireMock 替换为jest.createMockFromModule 有帮助。有时从自动模拟切换到实际数据很方便,反之亦然,示例中的方法允许通过单行更改来做到这一点。
    猜你喜欢
    • 2011-06-25
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    相关资源
    最近更新 更多