【问题标题】:ANGULAR: how to unit test a function with setValueControl角度:如何使用 setValueControl 对函数进行单元测试
【发布时间】:2022-01-04 14:43:57
【问题描述】:

我正在尝试对这个为每个值设置控件的简单函数进行单元测试。

fillFormAssociazioneVeicolo() {
    if (this.aaa) {
      setValueControl(
        this.aaa.targaTelaio,
        this.form.get('targaTelaio')
      );
      setValueControl(
        this.aaa.tipoVeicolo,
        this.form.get('tipoVeicolo')
      );
      setValueControl(
        this.aaa.tipoVeicolo?.descrizione,
        this.form.get('descTipoVeicolo')
      );
      setValueControl(
        this.aaa.nomeCognome,
        this.form.get('nomeCognome')
      );
      setValueControl(
        this.aaa.codiceFiscale,
        this.form.get('codiceFiscale')
      );
    }

这就是 setValueControl 函数的作用:

export function setValueControl(
  value: any,
  control: AbstractControl | null,
  disable: boolean = true
) {
  if (control) {
    control.setValue(value);
    if (disable) disableControl(control);
  }
}

我试过这种方法,但不是正确答案:

it('can fillFormAssociazioneVeicolo', () => {
    component.riempiFormAssociazioneVeicolo();
    expect(setValueControl(component.associazioneVeicolo?.tipoVeicolo,component.form.get('tipoVeicolo')));
  });

【问题讨论】:

    标签: angular typescript unit-testing controls angular-test


    【解决方案1】:

    首先,setValueControl 对单元测试并不是很好,因为它希望定义函数“disableControl”。为了使一个函数可以很好地测试,它不应该依赖于作用域上的函数,理想情况下它应该是纯粹的......无论如何

    export function setValueControl(
      value: any,
      control: AbstractControl | null,
      disable: boolean = true
    ) {
      if (control) {
        control.setValue(value);
        if (disable) control.disable();
      }
    }
    

    现在您可以在您提供的模拟对象上使用 spyOn(假设您使用的是 jasmine)来检查函数是否按预期工作:

    let controlMock = {
      setValue:(a) => {},
      disable: () => {}
    }
    
    const setValueSpy = spyOn(controlMock, 'setValue')
    const disableSpy = spyOn(controlMock, 'disable')
    
    setValueControl("ciao", controlMock)
    
    expect(setValueSpy).toHaveBeenCalledWith("guasto");
    expect(disableSpy).toHaveBeenCalled();
    

    【讨论】:

    • 类型参数 '{ setValue: (a: any) => void;禁用:() => 无效; }' 不可分配给“AbstractControl”类型的参数。输入 '{ setValue: (a: any) => void;禁用:() => 无效; }' 缺少“AbstractControl”类型的以下属性:_parent、_asyncValidationSubscription、value、validator 和 42 more.ts(2345)。这是我按照您的建议更改代码时显示的错误。
    • 您可以在测试中使用实际的“控制”。这只是为了示例,如何监视函数。例如:controlMock = new FormControl();
    猜你喜欢
    • 2019-05-15
    • 1970-01-01
    • 2021-03-11
    • 2020-07-10
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    相关资源
    最近更新 更多