Angular组件Jasmine测试报错:Cannot read property 'maxSize' of undefined
问题分析与解决方案
你遇到的这个情况确实有点绕——实际功能运行完全正常,但Jasmine测试偏偏抛出Cannot read property 'maxSize' of undefined,而且只针对maxSize报错,我们来拆解清楚:
核心问题:测试用例的方法传参错误
先看你的主组件isMinValid方法的定义:
isMinValid(currentItem: any, index: number) { // 方法逻辑明确期望currentItem是**单个包含minSize/maxSize的对象** }
但你的测试用例里是这么调用的:
let isMin: boolean = comp.isMinValid(comp.domicileInfo.taxAssesment.items, 0);
你把整个items数组传给了期望接收单个item的currentItem参数!
为什么只报maxSize的错?
JavaScript在执行表达式(+currentItem.minSize <= +currentItem.maxSize)时,会按顺序计算左右两侧:
- 左侧
+currentItem.minSize:当currentItem是数组时,currentItem.minSize是undefined,+undefined会被转换为NaN,这一步不会抛出错误(只是得到一个无效值)。 - 右侧
+currentItem.maxSize:如果你的domicileInfo.taxAssesment在测试初始化时存在异常(比如taxAssesment本身是undefined,导致你后续设置items时实际是在给undefined赋值),此时currentItem会变成undefined,访问undefined.maxSize就会抛出你看到的错误。
而实际功能中运行正常,是因为业务代码里调用isMinValid时,肯定是传入的单个item对象,而非数组,所以不会触发这个问题。
修复步骤
修正测试用例的传参
把调用改成传入数组中的单个item:fit('should return true because the index of the item is zero and min is less than max', () => { comp.domicileInfo.taxAssesment.items = [{ minSize: 30000000, maxSize: 40000000, values: [0.02, 0.02]}]; fixture.detectChanges(); console.log(comp.domicileInfo.taxAssesment.items); // 传入单个item而非整个数组 let isMin: boolean = comp.isMinValid(comp.domicileInfo.taxAssesment.items[0], 0); expect(isMin).toBe(true); });确保测试初始化时
domicileInfo的结构完整
检查domicileInformationDataResult.data是否包含完整的taxAssesment结构,避免在beforeEach中初始化时出现taxAssesment为undefined的情况。如果需要,可以在测试用例里显式初始化整个结构:comp.domicileInfo = { taxAssesment: { items: [{ minSize: 30000000, maxSize: 40000000, values: [0.02, 0.02]}] } // 补充其他必要属性... };优化组件方法的健壮性(可选)
为了避免类似问题,给isMinValid方法加上参数校验,提前拦截无效输入:isMinValid(currentItem: any, index: number) { // 先校验参数与依赖的有效性 if (!currentItem || !this.domicileInfo?.taxAssesment?.items) { return this._isMinValid; // 或者返回符合业务逻辑的默认值 } // 原有逻辑... }
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

