【问题标题】:how to unit test a function with multiple ifs inside?如何对内部具有多个 if 的函数进行单元测试?
【发布时间】:2022-01-26 09:00:17
【问题描述】:

我有一个我要在这里展示的大函数,它非常简单,但不知何故我找不到如何对其进行单元测试。 我不需要确切的单元测试,只是 ifs 的一般方法,即使 ifs 因为我真的很挣扎。 此外,当我在我的 ts 中调用该函数时(我正在使用 Angular.js) 这一行:this.nominativo = this.praticaDetail.operazioneDomiciliazioneDto.utente 是覆盖返回的在线行,我不知道为什么它与下面这样的this.variazione = this.praticaDetail.operazioneDomiciliazioneDto.dataOperazione; 相同。

updateIstanza() {
    
    this.nominativo = this.praticaDetail.operazioneDomiciliazioneDto.utente 
    this.variazione = this.praticaDetail.operazioneDomiciliazioneDto.dataOperazione;
    this._bc.set('@pratica', 'Pratica ' + this.praticaDetail.numeroIstanza);
    this.accordions.splice(4, 1);
    this.richiesta();
    if (
      this.praticaDetail.funzioniDto.urlRicevuta != ''
    ) {
      this.showRicevuta = true;
    }

    if(this.praticaDetail.statoDomiciliazioneDto.statoDomiciliazione == 4 || 
      this.praticaDetail.statoDomiciliazioneDto.statoDomiciliazione == 5 || 
      this.praticaDetail.statoDomiciliazioneDto.statoDomiciliazione == 9) {
      this.buttonDownload = true;
    }
    if(this.praticaDetail.statoDomiciliazioneDto.statoDomiciliazione == 4){
      this.buttonRevoca = true;
    }
  
    if (this.praticaDetail.statoDomiciliazioneDto.descrizione == STATI.ANNULLATA) {
      this.disabledStato = true;
      this.objectAlert = {
        title: 'Istanza annullata',
        text: this.praticaDetail.operazioneDomiciliazioneDto.noteOperazione
      }
      this.visualizzaAlert = true;
    }else if(this.praticaDetail.statoDomiciliazioneDto.descrizione == STATI.DA_DEFINIRE){
      this.notShow = true;
      if(this.showRicevuta){
        this.buttonDownload = true;
      }
    }else if(this.praticaDetail.statoDomiciliazioneDto.descrizione == STATI.IN_COMPILAZIONE){
      this.annullaButton = true;
    }else if(this.praticaDetail.statoDomiciliazioneDto.descrizione == STATI.SOSPESA) {
      this.showDefinizioneSospInteg = true;
      this.praticaSospesa = true;
    }else if(this.praticaDetail.statoDomiciliazioneDto.descrizione == STATI.ATTESA_SOTTOSCRIZIONE) {
      this.showSottoscrizione = true;
      this.objectAlert = {
        title: 'Attesa Sottoscrizione',
        text: "L'integrazione è stata inserita con successo: a breve verrà generata una ricevuta che completerà il processo d'integrazione"
      }
    }else if(this.praticaDetail.statoDomiciliazioneDto.descrizione == STATI.IN_DEFINIZIONE) {
      this.showDefinizione = true;
      this.disabledStato = true;
    }else if(this.praticaDetail.statoDomiciliazioneDto.descrizione == STATI.ACCETTATA) {
      this.notShow = true;
      this.notShowStato = true;
      this.objectAlert = {
        title: 'Domiciliazione Bancaria accettata',
        text: ''}
      if(this.showRicevuta) {
        this.buttonDownload = true;
      }
    }else if (
      this.praticaDetail.statoDomiciliazioneDto.descrizione == STATI.IN_REVOCA) {
      if(this.praticaDetail.inAttesa){
        this.disabledStato = true;
        this.objectAlert = {
          title: 'Attesa Sottoscrizione',
          text: "La richiesta di revoca è stata inserita con successo: a breve verrà completato il processo di sottoscrizione"
        }

      } else {
        this.showAsInRevocafunction();
        this.showAnnullata = true;
        this.accordionComponent?.openAccordion(
        this.accordionComponent.CONSTANTS.ID_ACCORDIONS.DOCUMENTI
        );
        this.sottoscrizioneCompletata = true;
      }
    }else if (this.praticaDetail.statoDomiciliazioneDto.descrizione == STATI.DA_REVOCARE) {
      this.showDefinizione = true;
      this.disabledStato = true;
      this.notShowStato = true;
      if(this.praticaDetail.inAttesa){
        this.objectAlert = {
          title: 'Attesa Istituto Bancario',
          text: "L'istanza si trova in attesa dell'esito da parte dell'istituto bancario"
        }
        this.visualizzaAlert = true;
        this.showSottoscrizione = true;
      }
    }
    }
     
    }
    
    if (this.dettaglio) {
      this.accordions = [
        new AccordionAssociazioneVeicolo(),
        new AccordionDatiRichiedente(),
        new AccordionDatiRichiesta(),
        new AccordionDocumenti(),
      ];
      this.notShowStato = true;
      this.showRettifica = false;
      this.inRettifica = false;
    }
    this.eventsSubject.next({
      istanza: this.praticaDetail,
      disabledStato: this.disabledStato,
    });
  } ```


【问题讨论】:

  • 基于 wlf 的回答,我建议查看 Robert "Uncle Bob" Martin、Kent Beck 和 Martin Fowler。他们在将代码重构为更小的函数方面拥有丰富的资源,因此可以更轻松地进行单元测试。

标签: javascript angular typescript unit-testing if-statement


【解决方案1】:
  1. 设置对象属性以便测试特定路径
  2. 致电updateIstanza
  3. 根据预期值进行测试

例子:

it('should set showRicevuta true when urlRicevuta is not empty', () => {
  const foo = new Foo();
  foo.praticaDetail.funzioniDto.urlRicevuta = 'not empty';
  foo.updateIstanza();

  expect(foo.showRicevuta).toBeTrue();
});

顺便说一句,拥有如此庞大的功能和如此多的控制路径并不是一个好习惯。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-03
    • 2019-04-15
    • 1970-01-01
    • 2011-07-26
    • 2013-06-03
    相关资源
    最近更新 更多