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

使用jest-mock-extended模拟IEmail接口时属性值丢失问题排查

问题分析与解决方法

问题根源

你用mock<IEmail>创建模拟对象时,错误传入了IEmail接口未定义的emailBody属性,却漏掉了接口要求的body属性。jest-mock-extended的mock<T>会严格遵循接口定义,额外传入的属性不会被保留,同时你没提供body字段,导致模拟出来的options对象里根本没有body,所以sendEmail中emailData.body取到undefined,最终映射后的所有字段都变成undefined。

正确的模拟方式

严格按照IEmail接口的定义构造模拟对象,传入body而非emailBody:

it('should send email', async () => {
  const options = mock<IEmail>({
    body: "You got mail", // 使用接口定义的body字段
    from: "marc@meta.com",
    to: "jane.doe@gmail.com",
  });

  mockemailService.send.mockResolvedValueOnce("");
  await emailService.sendEmail(options);
  expect(mockemailService.send).toHaveBeenCalledWith({
    emailBody: 'You got mail',
    emailBodyFrom: 'marc@meta.com',
    emailTo: 'jane.doe@gmail.com',
  });
});

额外优化建议

如果测试不需要精确指定所有字段,可以利用mock<IEmail>的自动模拟特性,只覆盖需要自定义的字段:

// 仅指定body,from和to会被自动生成符合类型的模拟值
const options = mock<IEmail>({ body: "You got mail" });

但如果测试需要精确匹配from和to的值,还是显式传入所有字段更稳妥。

内容的提问来源于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 19:55:31