You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 20:25:26