测试失败“预期的间谍doDeleteRule已被调用。”,茉莉花,业力

时间:2020-01-25 20:38:48

标签: angular unit-testing jasmine karma-jasmine

使用茉莉花素进行的直接测试失败。 “预期将调用间谍doDeleteRule。” 我注意到,如果删除了subscribe子句中的if语句,它将通过。但是,if语句是必需的,因为我只希望在返回的可观察值等于true时执行该方法。我还需要做/检查吗?

规格:

it('Should confirm delete before deletion, confirmDeleteRule', async(() => {
    const spyDoDeleteRule = spyOn(component, 'doDeleteRule');
    const spyShowConfirmModal = spyOn(confirmService, 'showConfirmModal').and.returnValue(Observable.of(true));
    component.confirmDeleteRule(new Event('click'), 5);

    fixture.detectChanges();

    expect(spyShowConfirmModal).toHaveBeenCalled();
    expect(spyDoDeleteRule).toHaveBeenCalled();
}));

组件:

  public confirmDeleteRule(ev: Event, rowIndex: number) {
    const modalConfig: ConfirmModalConfig = new ConfirmModalConfig(
      this.translateService.instant('overlay_group_modal_rule_delete.title'),
      this.translateService.instant('overlay_group_modal_rule_delete.rule_name') + ' ' + this.allRules[rowIndex] +
      this.translateService.instant('overlay_group_modal_rule_delete.prompt'),
      [
        [this.translateService.instant('actions.ok'), ConfirmButtonActions.YES],
        [this.translateService.instant('actions.cancel'), ConfirmButtonActions.CANCEL],
      ],
      ConfirmIcons.WARN,
    );

    this.confirmService.showConfirmModal(modalConfig, true).pipe(
      mergeMap((action: ConfirmButtonActions) => {
        if (action === ConfirmButtonActions.YES) {
          return Observable.of(true);
        } else {
          return Observable.of(false);
        }
      }),
      catchError((err) => {
        throw Observable.of(err);
      }),
    ).subscribe((deleteRule: boolean) => {
      if (deleteRule) {
        this.doDeleteRule(ev, rowIndex);
      }
    });
  }

1 个答案:

答案 0 :(得分:0)

方法confirmDeleteRule包含异步代码。将await放在调用此方法的行之前,应该可以解决问题(请参见async/await)。

await component.confirmDeleteRule(new Event('click'), 5);