Angular单元测试含split方法时报读取undefined属性错误如何解决
报错根因
- 你定义的
column、columnItem都是数组类型,但业务方法要求接收单个对象,直接取column.property自然是undefined,调用split方法就会抛出对应错误 - 测试用例调用
getCellData时参数顺序传反了,方法定义的入参顺序是(row: any, column: any),你实际传的是(column, value) - 预期结果逻辑错误:
getCellData的作用是返回嵌套属性对应的值,不是返回split后的属性数组
修复后的测试用例代码
fdescribe('getCellData:', () => { // 定义单个column对象,不是数组 const column: any = { property: 'address.street', label: 'Rua', type: 'boolean', }; // 定义单个row对象,不是数组 const row: any = { name: 'teste', address:{ street: 'Rua dos Alfeneiros, nº 4' } }; it('teste A', () => { // 调整入参顺序,预期结果对应实际的属性值 expect(component.getCellData(row, column)).toEqual('Rua dos Alfeneiros, nº 4'); }); });
可选:业务方法增加健壮性处理
如果要避免生产环境出现类似的空值报错,可以给业务方法加防御逻辑:
getCellData(row: any, column: any): any { // 先判断入参合法性 if (!column?.property || !row) { return undefined; } const nestedProperties: string[] = column.property.split('.'); let value: any = row; for (const prop of nestedProperties) { // 遍历过程中如果属性不存在就提前返回 if (value === undefined || value === null) { return undefined; } value = value[prop]; } return value; }
内容的提问来源于stack exchange,提问作者user14160660
相关产品推荐
相关产品推荐

