TypeScript类私有属性访问器测试疑问及优化方案咨询
嘿,我来帮你把这个问题掰扯清楚!
为什么没实现getter/setter,测试却通过了?
大概率是你的测试代码绕过了要测试的getter/setter,直接访问了私有属性_ssn。
你看,TypeScript里的private关键字只是编译阶段的语法限制——编译成JavaScript后,私有属性其实还是能被访问到的。如果你的测试写的是直接断言info._ssn的值,那不管有没有ssn的getter,这个测试都会通过,因为_ssn本身就在类里初始化了。但这种测试等于没测到getter/setter的逻辑,完全偏离了测试的目的。
当然能测试getter和setter的行为!
不仅能测,而且这才是你应该做的——测试它们对外暴露的行为,而不是内部的私有属性。举个例子:
- 对于getter,你要测的是调用
info.ssn时,返回的是不是你预期的值; - 对于setter,你要测的是赋值时的验证逻辑(比如SSN格式是否合法)、赋值后的值是否正确通过getter返回。
更好的测试getter/setter的方法
给你写个具体的测试示例(用Jest为例),这才是针对getter/setter的正确测试方式:
首先是测试getter:
test('ssn getter returns the correct private value', () => { const info = new PersonalInfo(); // 这里必须通过ssn属性访问,而不是直接碰_ssn expect(info.ssn).toBe('123-45-XXXX'); });
如果此时你还没实现ssn的getter,TypeScript编译阶段就会报错(提示ssn属性不存在),测试根本跑不起来——这就能及时发现问题,而不是像之前那样测试“假通过”。
然后是测试带验证逻辑的setter:
假设你后续要给setter加格式校验,比如只允许XXX-XX-XXXX格式的SSN,测试可以这么写:
test('ssn setter throws error for invalid format', () => { const info = new PersonalInfo(); // 测试非法赋值是否抛出预期错误 expect(() => { info.ssn = '123456789'; }).toThrow('Invalid SSN format'); }); test('ssn setter updates value correctly for valid input', () => { const info = new PersonalInfo(); const validSSN = '987-65-4321'; info.ssn = validSSN; // 再次通过getter验证赋值结果,而不是直接访问_ssn expect(info.ssn).toBe(validSSN); });
核心原则就是:测试行为,而非实现。你不需要关心类内部是用_ssn还是别的变量存数据,只需要保证调用ssn getter能拿到正确值,调用setter能按预期处理输入——这才是getter/setter存在的意义,也是你应该测试的点。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

