使用 jasmine 和 karma 进行单元测试时形成数组错误

Posted

技术标签:

【中文标题】使用 jasmine 和 karma 进行单元测试时形成数组错误【英文标题】:Forms array error while unit test using jasmine and karma 【发布时间】:2021-01-19 09:04:36 【问题描述】:

我正在为 Angular 应用程序版本 9 编写单元测试用例。但我遇到了错误。

TypeError: 无法读取未定义的属性“get”

如何监视 getFormControls 方法,否则我必须使用 spyonproperty,我尝试设置 spyonproperty 但得到不同的错误。

我是 jasmine 单元测试的新手,在大多数情况下都会受到打击,

ts:

  get getFormControls() 
    const control = this.relTable.get('tableRows') as FormArray;
    return control;
  

submit() 
    this.messageService.clear();

/*     const formGroup = this.getFormControls.controls[this.isEdit.length - 1] as FormGroup;
    const rNameValue = formGroup.controls['rName'].value;
    const pEntityValue = formGroup.controls['pEntity'].value;
    const cEntityValue = formGroup.controls['cEntity'].value;


    this.new_rel_Data.push(
      'rName': rNameValue,
      'pEntity': pEntityValue,
      'cEntity': cEntityValue
    );  */



     this.new_rel_Data.push(
      'rName': this.getFormControls.controls[this.isEdit.length - 1].get('rName').value,
      'pEntity': this.getFormControls.controls[this.isEdit.length - 1].get('pEntity').value,
      'cEntity': this.getFormControls.controls[this.isEdit.length - 1].get('cEntity').value
    ); 

    this.relTemp.addReldata(this.new_rel_Data).subscribe(
      (res) => 
        console.log(res);
        this.loadRelTemp();
        this.messageService.add( severity: 'success', summary: 'New value inserted successfully', sticky: true );
      ,
      (err) => 
        this.messageService.add( severity: 'error', summary: err.message, detail: 'Please contact Admin', sticky: true );
      ,
      () => 
        const control = this.relTable.get('tableRows') as FormArray;
        control.clear();
        this.enableSubmit = false;
      
    );

  

规格:

 // submit for insert new value
  fit('Submit() Relational data', () => 

    let data = [ 'foo' ];
    component.new_rel_Data = data;

  fixture.detectChanges();
    spyOn(component, 'submit').and.callThrough();
    

    spyOn(relTemplateUpdateService, 'addReldata').and.returnValue(
      of( result:  status: 200  )
    );
    component.submit();
    fixture.detectChanges();
    expect(component.submit).toHaveBeenCalled();
    expect(relTemplateUpdateService.addReldata).toHaveBeenCalledWith(data);
  );

【问题讨论】:

【参考方案1】:

当您遇到以下错误时:TypeError: Cannot read property 'get' of undefined,通常意味着您忘记在测试中添加/模拟某些内容(尽管这也可能发生在实际代码中的任何地方)。

在这种特殊情况下,您错过了模拟 relTablegetFormControls getter 的结果。

无论如何,我可能会像这样嘲笑 getter:

spyOnProperty(relTemplateUpdateService, 'getFormControls').and.returnValue(new FormArray([
    new FormGroup(
      rName: new FormControl('rName'),
      pEntity: new FormControl('pEntity'),
      cEntity: new FormControl('cEntity'),
    ),
  ]));

由于 TypeScript 不允许分配给 getter,您可能需要使用 spyOnProperty 方法而不是 relTemplateUpdateService.getFormControls = ... 之类的方法。如果它不是 getter,那么您也可以使用相同的返回值模拟 this.relTable,但我个人认为这不适用于 getter。

您还应该检查(在实际代码中可能更好;除非您确定不需要)this.isEdit 始终大于 0,否则,您将收到另一个未定义的错误。

【讨论】:

仍然出现相同的错误,我已将 relTemplateUpadteService 更改为如下所示的组件,因为 getFormControls 是组件内部的一种方法。 spyOnProperty(component, 'getFormControls').and.returnValue(new FormArray([ new FormGroup( rName: new FormControl('rName'), pEntity: new FormControl('pEntity'), 您可能需要分享更多详细信息(代码),因为对我来说它看起来有效。这可能是一个完全不同的领域。

以上是关于使用 jasmine 和 karma 进行单元测试时形成数组错误的主要内容,如果未能解决你的问题,请参考以下文章

在我的 JSPM 包上使用 JSPM 404 进行 Karma/Jasmine 单元测试

使用 jasmine / karma 进行 Angular 4 单元测试和 http post mocking - 如何修复

使用Jasmine和karma对传统js进行单元测试

为啥使用 jasmine 对 Node typescript 项目进行 Karma 单元测试会显示包含依赖项的覆盖范围?

单元测试 typescript 指令模板 karma-jasmine,html 未定义

使用 Karma Jasmine 的 Angular 1.5 组件模板单元测试