Jest中如何重置Mock函数并为各测试用例设置不同返回值?
问题原因分析
你遇到的核心问题是在test #1中直接替换了mock.foo的引用:你把mock.foo重新赋值为一个全新的jest.fn()实例,覆盖了jest.mock自动生成的原始mock函数。后续的mockReset()只对这个新函数生效,但测试结束后这个带"default"返回的新函数仍然绑定在mock对象上,导致test #2调用的还是它,而非你预设的通用mock实现。
解决方案
方案1:不替换mock函数,直接修改原有mock的行为
这是最规范的做法,直接在jest.mock生成的原始mock函数上设置返回值,避免覆盖引用:
const mock = require('module-to-mock'); jest.mock('module-to-mock'); describe('tests', () => { // 每个测试前重置mock,清除临时返回值设置,恢复通用mock beforeEach(() => { jest.clearAllMocks(); // 如果通用mock有默认实现,可在这里重新绑定(比如从__mocks__文件中导入) // mock.foo.mockImplementation(通用实现函数); }); it('test #1', async () => { // 直接在现有mock.foo上链式设置返回值,不替换整个函数 mock.foo .mockReturnValueOnce(1) // 第一次调用返回1 .mockReturnValueOnce(2) // 第二次调用返回2 .mockReturnValue("default"); // 后续调用返回default // 执行测试逻辑 }); it('test #2', async () => { mock.foo.mockImplementationOnce(() => 3); // 第一次调用返回3,后续恢复通用mock的返回值 // 执行测试逻辑 }); });
方案2:手动恢复原始mock引用
如果必须替换mock函数,可以在测试前后保存并恢复原始mock的引用:
const mock = require('module-to-mock'); jest.mock('module-to-mock'); describe('tests', () => { // 保存jest.mock生成的原始mock函数 const originalFooMock = mock.foo; // 每个测试后恢复原始mock afterEach(() => { mock.foo = originalFooMock; jest.clearAllMocks(); }); it('test #1', async () => { mock.foo = jest .fn() .mockReturnValueOnce(1) .mockReturnValueOnce(2) .mockReturnValue("default"); // 执行测试逻辑 }); it('test #2', async () => { mock.foo.mockImplementationOnce(() => 3); // 此时使用的是原始通用mock函数,行为符合预期 // 执行测试逻辑 }); });
内容的提问来源于stack exchange,提问作者User7723337
相关产品推荐
相关产品推荐

