JavaScript中测试属性描述符需先获取描述符并断言字段值,再验证运行时行为是否匹配:如writable为false时赋值是否失败、configurable为false时delete是否返回false、enumerable为false时是否不出现在Object.keys()中,同时覆盖访问器属性及非法组合等边界场景。

JavaScript 中属性描述符(Property Descriptor)本身不是运行时可直接“执行”的逻辑,因此在单元测试中不直接“测试描述符”,而是测试描述符所定义的行为是否符合预期——比如属性是否可写、是否可枚举、是否可配置、是否为访问器属性等。检测的关键在于:通过 Object.getOwnPropertyDescriptor 获取描述符,再断言其字段值;同时配合实际操作(如赋值、遍历、删除)验证运行时表现是否与描述符一致。
获取并断言描述符字段值
这是最基础的检测方式。适用于测试对象初始化后属性的元信息是否按预期设置。
- 使用
Object.getOwnPropertyDescriptor(obj, key)获取描述符对象 - 用断言库(如 Jest、Vitest)检查
writable、enumerable、configurable、value或get/set是否存在且正确 - 注意:普通数据属性和访问器属性的描述符结构不同,需区分判断
示例(Vitest):
const obj = { a: 1 };Object.defineProperty(obj, 'b', { value: 2, writable: false, enumerable: true });
const desc = Object.getOwnPropertyDescriptor(obj, 'b');
expect(desc).toEqual({ value: 2, writable: false, enumerable: true, configurable: false });
验证运行时行为是否匹配描述符
仅检查描述符字段不够——必须验证 JavaScript 引擎是否真的按该描述符执行。例如:writable: false 应阻止赋值(严格模式下抛错,非严格模式静默失败);configurable: false 应阻止 delete 和再次 redefine。
立即学习“Java免费学习笔记(深入)”;
- 对
writable: false属性,尝试赋值并检查是否未改变(非严格模式)或是否抛出TypeError(严格模式) - 对
configurable: false属性,尝试delete obj.key并断言返回false,或尝试再次defineProperty并捕获错误 - 对
enumerable: false,检查该属性不出现在Object.keys()、for...in、JSON.stringify()中
测试访问器属性(getter/setter)的定义与调用
访问器属性的描述符包含 get 和/或 set 函数。测试重点是:函数是否被正确定义、是否按预期触发、是否能读写中间状态。
- 用
Object.getOwnPropertyDescriptor确认get/set是函数,且value和writable不存在 - 显式调用
get函数,或通过点号读取属性,验证返回值 - 对有
set的属性,赋值后检查副作用(如内部变量变更、事件触发) - 注意:不要在测试中依赖
this指向,建议用get.call(context)显式控制上下文
覆盖边界与兼容性场景
某些描述符组合非法(如同时设置 value 和 get),或在不同环境表现不同(如严格模式 vs 非严格模式)。单元测试应主动覆盖这些情况。
- 测试非法描述符是否被
Object.defineProperty拒绝(抛TypeError) - 在严格模式下运行关键测试(如对不可写属性赋值),确保错误被正确抛出
- 若代码需支持旧环境(如 IE8),注意其不支持
get/set,描述符只支持数据属性


















