如何在jest-mock-extended中将Mock属性设置为undefined?
解决jest-mock-extended mock对象无法设置属性为undefined的问题
当你用jest-mock-extended的mock<IEmail>()创建对象后,直接给from属性赋值undefined会失效——本质是因为mock对象通过Proxy实现,动态生成的mock属性会拦截直接赋值操作,导致实际传入的还是默认的mock函数。下面是几种可行的解决方法:
方法1:用Object.defineProperty强制设置属性
通过Object.defineProperty可以绕过Proxy的拦截,直接将属性值设为undefined:
const emailMock = mock<IEmail>(); // 强制将from属性设置为undefined,同时允许后续修改 Object.defineProperty(emailMock, 'from', { value: undefined, writable: true });
方法2:初始化mock时直接指定undefined属性
如果在创建mock对象时就明确需要from为undefined,可以直接传入初始化配置:
const emailMock = mock<IEmail>({ from: undefined });
注意:部分版本的jest-mock-extended可能会忽略undefined的初始化属性,此时优先用方法1。
方法3:手动创建半mock对象
如果不需要完全mockIEmail的所有属性和方法,直接手动构建对象更简单,避免Proxy的干扰:
// 只mock需要的方法,其他属性按需设置 const emailMock = { from: undefined, send: jest.fn() } as IEmail;
测试示例
以测试sendEmail函数为例,验证默认邮箱是否生效:
test('sendEmail使用默认邮箱当from为undefined时', () => { const emailMock = mock<IEmail>(); Object.defineProperty(emailMock, 'from', { value: undefined, writable: true }); sendEmail(emailMock); expect(emailMock.send).toHaveBeenCalledWith(expect.objectContaining({ from: 'default_email@mail.com' })); });
内容的提问来源于stack exchange,提问作者Hugo
相关产品推荐
相关产品推荐

