【问题标题】:Test case for a function call within a function fails in Jasmine/Karma (Angular test cases)函数内函数调用的测试用例在 Jasmine/Karma 中失败(Angular 测试用例)
【发布时间】:2021-10-08 11:56:27
【问题描述】:

我正在学习编写测试用例,并且一直在尝试解决旧的测试用例并使其正常工作,但我陷入了一个特定的场景,其中我有一个如下角度的函数

PasswordBox(): void {
    const dialogRef = this.dialog.open(PasswordComponent, {
      width: '600px',
      data: {
        userDetails: this.userData.email,
      }
    });
    dialogRef.afterClosed().subscribe(result => {
    });
  }

对于.spec文件中的上述函数已经编写了如下测试用例

 it('should navigate to create user', fakeAsync(() => {
   fixture.whenStable().then(() => {
    spyOn(component,'PasswordBox').and.callFake;
    expect(dialogSpy).toHaveBeenCalledTimes(1);
    });
  }));

但是当我运行测试用例时它仍然失败并说 预计 spy open 已被调用一次。它被调用了 0 次

我哪里出错了,我只需要检查是否在 Passwordbox 中调用了 dialog.open,如果缺少任何信息,请指导,请告诉我,以便我更新问题

已经在 beforeEach as 中创建了 dialogspy

dialogSpy = spyOn(component.dialog, 'open').and.callThrough();

【问题讨论】:

    标签: angular jasmine karma-jasmine karma-runner


    【解决方案1】:

    我认为问题出在callFake 电话中。

    间谍:and.callFake 通过将间谍与 and.callFake 链接起来,所有调用 间谍将委托给提供的函数。

    所以看起来你不是调用component.PasswordBox() 而是用callFake 伪造函数,所以永远不会调用真正的函数。

    另外callFake 接受methoid 作为参数,你没有传递任何东西。 https://jasmine.github.io/api/edge/SpyStrategy.html

    【讨论】:

      【解决方案2】:

      你在 PasswordBox 上安装了一个间谍,所以你不调用它。

      作为说明,我认为.and.callFake 不能那样,但需要一个参数,例如.and.callFake(() => { /* do some stuff */ })。

      我的建议是改用callThrough,这样您可以在检查您的 PasswordBox 方法是否被调用的同时,仍然可以获得您想要测试的行为。

      如果您实际上不想在测试中打开对话框,则应模拟 dialog.open 方法。

      所以你可以这样做:

      const mockDialogRes = ... // whatever your dialog should return
      const dialogSpy = spyOn(component.dialog, 'open').and.returnValue({
        afterClosed: of(mockDialogRes),
      })
      
       it('should navigate to create user', fakeAsync(() => {
         fixture.whenStable().then(() => {
          spyOn(component,'PasswordBox').and.callThrough();
          expect(dialogSpy).toHaveBeenCalledTimes(1);
          });
        }));
      
      

      【讨论】:

      • @Brain 我按照提供的解决方案进行了尝试,但仍然失败,失败日志显示“预期间谍打开已被调用一次。它被调用了 0 次。”
      猜你喜欢
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 2018-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多