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

测试中类实例调用update方法后属性未更新问题如何解决

问题原因

你遇到的断言失败和「类实例需要刷新」没有关系,本质是测试断言方法使用错误:

  • 绝大多数测试框架(Jest、Vitest等)的toBe匹配器执行的是严格相等比较:对于布尔、数字、字符串等基础类型,会直接比较值;对于数组、对象这类引用类型,只会比较内存地址是否指向同一个实例,不会递归比较内部属性/元素是否相等。

你测试代码里expect(party.ticketIds).toBe(["ticket-1", "ticket-2"])从初始化校验阶段就会失败:初始化Party传入的数组和断言里写的数组是两个完全独立的实例,内存地址不同,哪怕元素完全一致也会断言不通过,你误以为是update后的属性没更新,实际是第一步的断言就已经不符合预期。

解决方案

把所有数组、对象类型的断言从toBe换成toEqual即可,toEqual会递归比较引用类型的内部值是否相等:

it("update() should update the party information", () => {
  OrderService.getInformation.mockReturnValue({ checkedIn: true, currentZone: { id: 1} })
  const party = new Party(["ticket-1", "ticket-2"])

  // 检查初始值符合预期
  expect(party.ticketIds).toEqual(["ticket-1", "ticket-2"])
  expect(party.isCheckedIn).toBe(false)
  expect(party.currentZoneId).toBe(undefined)

  // 执行update后再次校验
  party.update()
  expect(party.ticketIds).toEqual(["ticket-1", "ticket-2"])
  expect(party.isCheckedIn).toBe(true)
  expect(party.currentZoneId).toBe(1)
})
额外排查点

如果修改断言后仍失败,可检查两个场景:

  • 你对OrderService.getInformation的mock是否生效:如果实际调用时的参数和mock预期的参数不匹配,会返回默认值而非你指定的测试返回值
  • 实际业务中的update方法是否为异步逻辑:如果是异步方法,你需要在测试中增加async/await等待方法执行完成后再做断言

内容的提问来源于stack exchange,提问作者Lee P

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 03:33:03