使用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
相关产品推荐
相关产品推荐

