为何在TypeScript中无法用Jest spyOn File.prototype.text方法?
为什么Jest无法监视File.prototype.text?
问题原因
核心矛盾在于TypeScript类型定义和运行时原型链结构的差异,以及Jest spyOn的行为限制:
- TypeScript中
File接口继承Blob,类型层面会让你误以为File.prototype直接拥有text方法,但实际运行时,text方法是定义在Blob.prototype上的,File.prototype本身并没有这个属性——它只是通过原型链继承了该方法。 jest.spyOn(object, methodName)默认仅查找对象自身拥有的属性(即object.hasOwnProperty(methodName)返回true的属性),不会遍历原型链。因此当你尝试监视File.prototype.text时,Jest找不到这个自身属性,就会报错提示它是undefined。
而你直接赋值File.prototype.text = jest.fn()能运行,是因为这行代码在File.prototype上添加了一个自身的text属性,覆盖了原型链上继承来的方法,此时Jest就能识别到它。
解决方案
方案1:直接监视Blob.prototype.text
既然text方法实际定义在Blob的原型上,直接针对该对象创建spy即可:
const textSpy = jest.spyOn(Blob.prototype, "text").mockImplementation(function(this: Blob) { return Promise.resolve("模拟文本内容"); }); // 执行测试逻辑... // 测试结束后恢复原始实现 textSpy.mockRestore();
方案2:先给File.prototype添加自身属性再监视
如果只想针对File实例监视text方法,可以先在File.prototype上显式定义text属性(覆盖继承的方法),再创建spy:
// 确保File.prototype拥有自身的text属性 if (!File.prototype.hasOwnProperty("text")) { File.prototype.text = Blob.prototype.text; } // 现在可以正常创建spy const fileTextSpy = jest.spyOn(File.prototype, "text").mockImplementation(function(this: File) { return Promise.resolve("模拟文件文本"); }); // 执行测试逻辑... // 清理mock fileTextSpy.mockRestore();
内容的提问来源于stack exchange,提问作者Fernando M
相关产品推荐
相关产品推荐

