如何使用Jest对外部引用的对象进行Mock?
Jest 同模块导出对象Mock方案
核心说明
当前场景为同模块内的函数引用了同模块导出的常量对象,因为ES模块导出是绑定引用,可根据你的实际需求选择对应方案实现Mock:
场景1:仅需要修改对象的属性值
如果不需要替换整个objectIWantToMock对象,只需要修改它内部的属性,直接修改导入的对象属性即可:
// ./external.test.js import * as external from './external.js' describe('when object is different', () => { // 每次测试前恢复模块原始状态,避免用例互相影响 beforeEach(() => { jest.resetModules() }) it('should do something different when stuff property changes', () => { // 直接修改导出对象的属性,函数内部读取的会是修改后的值 external.objectIWantToMock.stuff = { testKey: 'testValue' } const result = external.functionToTest() // 替换为你的实际断言逻辑 expect(result).toContain('testValue') }) })
场景2:需要完全替换整个对象
如果要替换整个objectIWantToMock对象(因为是const声明的常量,无法直接赋值替换),可以用jest.replaceProperty实现:
// ./external.test.js import * as external from './external.js' describe('when object is different', () => { // 每次测试后恢复所有Mock的原始值 afterEach(() => { jest.restoreAllMocks() }) it('should use the completely mocked object', () => { // 定义你要替换的Mock对象 const mockedObject = { stuff: { newKey: 'newValue' } } // 替换模块导出的objectIWantToMock jest.replaceProperty(external, 'objectIWantToMock', mockedObject) const result = external.functionToTest() // 替换为你的实际断言逻辑 expect(result).toContain('newValue') }) })
备选通用方案(兼容所有场景)
如果上述方案因为项目转译配置不生效,可以直接Mock整个模块:
// ./external.test.js // 先对整个external模块做Mock,保留原模块其他逻辑的同时覆写要Mock的对象 jest.mock('./external.js', () => { const originalModule = jest.requireActual('./external.js') return { ...originalModule, objectIWantToMock: { stuff: {} } } }) // 导入模块内容 import { functionToTest, objectIWantToMock } from './external.js' describe('when object is different', () => { it('should use the mocked object', () => { // 修改Mock对象的值 objectIWantToMock.stuff = { mockKey: 'mockValue' } const result = functionToTest() // 替换为你的实际断言逻辑 expect(result).toContain('mockValue') }) })
内容的提问来源于stack exchange,提问作者Dzone64
相关产品推荐
相关产品推荐

