JavaScript类实例化失败:单元测试未通过,配置未应用defaultConfig默认值
类实例化默认配置重置异常问题排查
根因定位
你贴出的类实现逻辑本身符合预期,若第三个测试用例失败,核心原因大概率是实际运行的类代码中,Object.assign 未传入空对象作为合并目标,即错误写法为 Object.assign(defaultConfig, config),而非你展示的 Object.assign({}, defaultConfig, config)。
Object.assign(target, ...sources)会直接修改第一个参数target的属性,修改完成后返回该目标对象。
如果直接把模块顶层的defaultConfig作为合并目标,每次实例化都会直接篡改原始默认配置:
- 第一次实例化传空对象,
defaultConfig无修改,测试通过 - 第二次实例化传
{texture: 'smooth'},直接将defaultConfig.texture改为'smooth',当前实例属性符合断言,测试通过 - 第三次实例化传
{color: 'green'},此时已被污染的defaultConfig已经是{color: 'blue', texture: 'smooth'},合并后得到的texture为'smooth',与断言期望的'rough'不符,测试失败。
正确实现验证
你贴出的带空对象的写法是合规的:
this.config = Object.assign({}, defaultConfig, config);
- 第一个参数传入空对象
{},每次合并都会生成全新的配置对象 - 不会篡改原始的
defaultConfig常量,也不会被其他实例的配置污染 - 每个实例的config都是基于未被修改的默认值,结合传入参数合并得到,无残留属性
确认代码无误后的排查方向
- 检查是否有其他代码直接修改了模块内的
defaultConfig(比如误将defaultConfig导出后被外部篡改) - 排查是否使用了类字段提前赋值的写法:类字段初始化执行时机早于constructor,此时
this.config还未完成合并,会导致属性取值异常 - 检查测试用例之间是否存在共享状态污染,比如全局挂载的实例未被清理,被后续测试修改了属性
内容的提问来源于stack exchange,提问作者Kevin Danikowski
相关产品推荐
相关产品推荐

