You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular Jasmine单元测试报错:Cannot read property 'firstName' of undefined

解决Angular组件测试中"Cannot read property 'firstName' of undefined"的问题

这个报错的根源很明确:你的组件在构造函数阶段就直接依赖了ActivatedRoute.snapshot.data中的dossier数据,但测试套件里没有给ActivatedRoute提供模拟的快照数据,导致this.dossier是undefined,自然读取firstName时就会抛出错误。

你需要修改测试套件的以下几个部分:

1. 模拟ActivatedRoute的快照数据

在测试模块的providers数组中,添加一个模拟的ActivatedRoute对象,把组件需要的dossier、dossierItems、profileImage数据塞进snapshot.data里,确保组件初始化时能拿到有效数据。

2. 修正Providers数组的格式

你原来的providers写法有问题——把多个服务塞进了同一个对象里,每个服务/提供者应该是数组的单独元素,否则Angular无法正确识别这些依赖。

3. 确保FormBuilder能被正确注入

组件里用到了FormBuilder构建表单,但测试代码里没有明确导入相关模块,最好在imports里添加ReactiveFormsModule(如果DossierModule已经导出该模块,这一步可以省略)。

修改后的完整测试代码

describe('DossierPersonalDataComponent', () => {
  let component: DossierPersonalDataComponent;
  let fixture: ComponentFixture<DossierPersonalDataComponent>;

  beforeEach(waitForAsync(() => { // 新版本Angular推荐用waitForAsync代替async
    TestBed.configureTestingModule({
      imports: [
        RouterTestingModule,
        HttpClientTestingModule,
        DossierModule,
        BrowserModule,
        ReactiveFormsModule // 新增,确保FormBuilder可被注入
      ],
      declarations: [DossierPersonalDataComponent],
      providers: [
        DossierFileService,
        ErrorProcessor,
        {
          provide: DomSanitizer,
          useValue: {
            sanitize: () => 'safeString',
            bypassSecurityTrustHtml: () => 'safeString'
          }
        },
        // 新增:模拟ActivatedRoute,提供组件需要的快照数据
        {
          provide: ActivatedRoute,
          useValue: {
            snapshot: {
              data: {
                dossier: {
                  firstName: 'Test',
                  lastName: 'User',
                  mobile: '1234567890',
                  company: 'Test Corp',
                  buddy: 'Test Buddy',
                  supervisor: 'Test Supervisor',
                  dateOfBirth: new Date('1990-01-01')
                },
                dossierItems: [], // 可根据实际业务模拟结构匹配的数据
                profileImage: null // 或模拟一个符合要求的File对象
              }
            }
          }
        }
      ]
    })
    .compileComponents()
    .then(() => {
      fixture = TestBed.createComponent(DossierPersonalDataComponent);
      component = fixture.componentInstance;
    });
  }));

  it('should create', () => {
    expect(component).toBeTruthy();
  });
});

额外提醒

看你提供的组件构造函数代码,用到了this.formBuilder但构造参数里没有注入FormBuilder,记得补上这个依赖:

constructor(
  private dossierService: DossierService,
  private route: ActivatedRoute,
  private sanitizer: DomSanitizer,
  private dossierFileService: DossierFileService,
  private errorProcessor: ErrorProcessor,
  private dialog: MatDialog,
  private formBuilder: FormBuilder // 补上这个注入参数
) {
  // ... 原有代码逻辑
}

内容的提问来源于stack exchange,提问作者NiceTobeBottleInfinity

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 06:58:13