测试原型属性需明确目标:验证是否定义在原型而非实例上,用 object.getprototypeof(obj).hasownproperty('prop') 精准检测;防污染需 beforeeach/aftereach 重置;推荐 chai 断言清晰表达意图。

测试原型对象上的属性,关键不是“能不能测”,而是“测什么、怎么避免误判”。原型上的属性容易被实例遮蔽、动态修改或污染,直接断言 obj.prop 可能测的是实例自身,而不是原型本身。
明确测试目标:区分实例属性和原型属性
先确认你要验证的是“该属性是否定义在原型上”,而非“该属性当前能否访问”。常用方法是结合 hasOwnProperty 和 Object.getPrototypeOf:
-
检查是否在原型链上存在且非自有:
!obj.hasOwnProperty('methodName') && typeof obj.methodName === 'function' -
精确定位到原型对象:
Object.getPrototypeOf(obj).hasOwnProperty('methodName') - 若用 Jest,可写成:
expect(Object.getPrototypeOf(instance)).toHaveProperty('render')
防止原型污染干扰测试结果
原型是共享的,前一个测试可能已修改 Person.prototype,导致后续测试失败或误通过。务必在每个测试前后重置:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 测试前保存原始值:
const originalMethod = Person.prototype.sayHello; - 测试后恢复:
Person.prototype.sayHello = originalMethod; - 更稳妥的做法是用
beforeEach/afterEach创建干净副本,或使用jest.resetModules()(配合require动态加载)
用断言库表达更清晰的意图
原生 assert 或 console.assert 难以描述“该方法来自原型”,推荐用 Chai 的 expect 风格:
expect(Object.getPrototypeOf(user)).to.include.keys('login')-
expect(user.login).to.be.a('function')(验证可调用) -
expect(user).not.to.have.ownProperty('login')(确认非自有)
覆盖常见异常场景
原型属性测试容易忽略边界情况:
- 属性被意外删除:
delete MyConstructor.prototype.init后是否仍能检测缺失? - 属性被赋值为
undefined或null,但仍在原型上 —— 此时in操作符仍为true,需结合typeof判断有效性 - 多个构造函数共用同一原型(如继承链中),要确保断言作用于正确层级:
Object.getPrototypeOf(Object.getPrototypeOf(child))
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










