JEST 模拟是否有可能被彼此覆盖?

Bry*_*yan 5 javascript testing mocking jestjs

我有两个测试,看起来像:

import someThing from '../someThing';
jest.mock('../someThing');

describe('group', () => {
    it('test #1', async () => {
        someThing.someFunction.mockImplementation(() => 123);
    });
    it('test #2', async () => {
        someThing.someFunction.mockImplementation(() => 456);
    });
});

Run Code Online (Sandbox Code Playgroud)

我看到一个问题,第二个测试中似乎调用了第一个测试中的模拟实现。如果我禁用测试#1 测试#2 按预期工作。(我的实际代码比这更复杂)。

我需要为两者进行单独的模拟的原因是,在给定相同输入的情况下,一个应该返回失败结果,一个应该返回成功结果。

据我了解,JEST 并行运行所有测试,因此我假设发生的情况是两个测试同时修改了模拟实现,因为它是相同的导入。

Est*_*ask 5

实际上从来不希望测试相互影响。

根据经验,Jest 间谍需要在测试之间恢复到原始状态:

beforeEach(() => {
  jest.restoreAllMocks();
  jest.clearAllMocks();
});
Run Code Online (Sandbox Code Playgroud)

restoreMocks或者最好使用 Jest和配置选项无条件应用于所有测试clearMocks

不这样做会导致测试交叉污染。

解决方法是使用*Once方法,正如另一个答案所描述的那样。当与 一起使用时*restore*,它们仅用于单个测试中的顺序模拟。

据我了解,JEST 并行运行所有测试

Jest 并行运行测试文件。至于单个测试,情况并非如此,除非concurrent正在使用测试。