角度测试 - 如何模拟 IF 条件

Posted

技术标签:

【中文标题】角度测试 - 如何模拟 IF 条件【英文标题】:Angular test - how to mock IF conditions 【发布时间】:2022-01-12 16:52:25 【问题描述】:

我试图在我的组件中模拟以下方法,但测试似乎没有进入 if 条件

onChange()
    this.selectedType = this.typeCtrl.value;
    this.selectedTypeLabel = this.typeCtrl.value;
    
    if(this.selectedType === 'Org')
        this.loadOrg();
    else  if(this.selectedType === 'Rep')
        this.loadRep();
    
    else if(this.selectedType === 'Teis')
      this.loadTeis();
    

    else if(this.selectedType === 'All')
      this.data();
    
    
  

这是我在规范文件中的测试-

it('call onChange', () => 
  const spySubscribable = spyOn(component, 'fetch');
  const spySubscribable1 = spyOn(component, 'loadOrg');

 fixture.debugElement.componentInstance.orgCtrl.setValue('Org');
  let val = fixture.debugElement.componentInstance.orgCtrl.value;
  component.onChange();
  component.selectedType = val;
  component.selectedTypeLabel = val;
  component.loadOrg();
  expect(component.selectedType).toEqual(val);
  expect(spySubscribable1).toHaveBeenCalled();

  val = 'Rep';
  component.selectedType = val;
  component.selectedTypeLabel = val;
  component.onChange();
  fixture.detectChanges();
  component.loadRep();
  expect(component.selectedType).toEqual(val);

  val = 'Teis';
  component.selectedType = val;
  component.selectedTypeLabel = val;
  component.onChange();
  fixture.detectChanges();
  component.loadTeis();
  expect(component.selectedType).toEqual(val);

  val = 'All;
  component.selectedType = val;
  component.selectedTypeLabel = val;
  component.onChange();
  fixture.detectChanges();
  expect(component.selectedType).toEqual(val);
  expect(spySubscribable).toHaveBeenCalled();
  
);

如何在我的方法中测试所有 4 个 if 条件。我已经尝试将值分配给它,但它仍然没有覆盖。

【问题讨论】:

【参考方案1】:

当您触发 onChange() 方法时,this.selectedTypethis.selectedTypeLabel 从中获取新值

 this.selectedType = this.typeCtrl.value;
 this.selectedTypeLabel = this.typeCtrl.value;

如果您没有为 typeCtrl 属性赋值,那么 selectedTypeselectedTypeLabel 将是 undefined

尝试组件component.typeCtrl = new FormControl('Org');,你的测试应该进入if语句

【讨论】:

你是对的..这解决了这个问题。非常感谢!

以上是关于角度测试 - 如何模拟 IF 条件的主要内容,如果未能解决你的问题,请参考以下文章

角度测试 - 如何在角度测试中模拟 document.getElementbyId?

用玩笑进行单元测试时,如何以角度模拟 ResizeObserver polyfill?

如何在角度 7 中使用带有 [ngClass] 的 if-else 条件? [复制]

如何模拟具有要求字段的角度指令

角度单元测试是否根据来自服务的数据调用组件方法

如何在角度 9 中为多个 if else 语句编写测试用例