测试中类实例调用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
相关产品推荐
相关产品推荐

