Angular Karma编写get存取器单元测试报not a function错误
报错原因
- 业务代码中
searchTerm是通过get关键字定义的存取器(getter),本质是类的公开只读属性,不是普通成员方法。 - 测试代码中写
(component as any).searchTerm()时,相当于尝试把searchTerm的属性值(初始值是空字符串)当做函数执行,自然会抛出「searchTerm is not a function」的类型错误。 - TypeScript的getter在编译后会绑定到对象的属性描述符上,访问时直接通过属性名取值即可,不需要加括号调用。
修复方案
调整测试代码中searchTerm的访问方式,去掉调用时的括号即可,优化后的测试代码如下:
it('searchTerm should return value from inner state', () => { // 初始化私有状态作为测试前置条件 (component as any)._state = { page: 1, pageSize: 4, searchTerm: '', sortColumn: '', sortDirection: '' }; // getter是属性,直接访问,不要加() const result = component.searchTerm; expect(result).toEqual(''); // 可补充非空场景验证逻辑正确性 (component as any)._state.searchTerm = 'angular'; expect(component.searchTerm).toEqual('angular'); });
额外说明
- 因为
get searchTerm()本身是公开的类成员,不需要通过as any绕开TS类型校验访问,直接通过组件实例访问即可,符合单元测试「测公开行为、不测内部实现」的原则。 - 只有访问被
private修饰的内部属性_state时,才需要用as any临时绕过编译阶段的访问权限校验。
内容的提问来源于stack exchange,提问作者MA-Dev
相关产品推荐
相关产品推荐

