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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 16:40:10