【问题标题】:Not able to test if nested function is called in Jasmine无法测试是否在 Jasmine 中调用了嵌套函数
【发布时间】:2021-03-09 04:09:36
【问题描述】:

我正在学习用 jasmine 编写测试用例,我正在尝试创建一个测试用例来检查函数中定义的函数是否被调用

我要测试的功能如下,sData方法写在另一个组件中,当前组件正在扩展

public rPage() {
    this.sData();
    this.setupPage()
  }

我写的测试用例如下

   it('should check if  sData is called', () => {
    const sData = spyOn<any>(component, 'sData');
    component.rPage();
    fixture.detectChanges();
    expect(sData).toHaveBeenCalled();
  });

已经在 beforeeach 中的 rpage 上创建了 spy,如下所示

 beforeEach(() => {
    fixture = TestBed.createComponent(BasicComponent);
    component = fixture.componentInstance;
    spyOn(component, 'rPage');
    fixture.detectChanges();
  });

当我运行测试时,测试用例失败说“预期的间谍 sData 已被调用。” ,我哪里出错了

【问题讨论】:

    标签: angular jasmine karma-jasmine


    【解决方案1】:

    如果要确保调用sData,则需要正确调用rPage。通过在您的 beforeEach 中添加 spyOn(component, 'rPage'); ,您实际上是在告诉您所有的测试永远不要真正运行 rPage,而只是模拟它。因此,它永远不会被真正调用,sData 真的永远不会被调用。

    为了让你正确检查rPage,你不需要在测试它的测试中使用spy,或者将.and.callThrough()添加到spy到实际调用的函数中

    【讨论】:

    • 以及如何使间谍不被用于特定测试?
    • 您可以将其从您的beforeEach 中删除,并仅将其包含在您需要的测试中。如果需要多个,可以使用内部describe。请随时查看此链接以获取更多信息stackoverflow.com/questions/31182170/…
    【解决方案2】:

    您正在调用函数然后定义间谍,这就是导致问题的原因。您需要定义间谍然后调用该函数。

    试试下面

      it('should check if sData is called', () => {
        const toggleSpy = spyOn<any>(component, 'sData');
        component.rPage();
        fixture.detectChanges();
        expect(toggleSpy).toHaveBeenCalled();
      });
    

    【讨论】:

    • 还是没有通过测试
    • 是否与已经使用 spy @owen 模拟的 rPage 相关
    • 错误提示预期间谍 sData 已被调用。你能分享你定义了一个名为 sData / sDataSpy 的间谍的代码吗
    • 已在问题中更新它,在测试用例部分@owen
    猜你喜欢
    • 1970-01-01
    • 2020-01-26
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多