如果与其他测试一起运行,则角度单元测试的行为会有所不同

时间:2018-08-10 20:04:45

标签: angular angular-unit-test

注意:下面的描述中提供了相关的代码段。
我正在使用Angular 5.2.11版,Jasmine 2.6.4版和Karma 1.7.1版运行单元测试。 当我仅对有问题的组件运行单元测试时(忽略应用程序中的其余测试),所有测试都将成功。但是,当我对所有其他组件进行测试运行时,一个测试失败,给我一个错误,提示“ component.objList未定义”。当我最初对错误感到困惑时,我将控制台日志记录语句放到了整个组件以及要尝试测试的函数中(component.getObj()),并意识到当我仅对该组件运行单元测试时,它会调用该函数(这是预期的,因为我在下面的代码中显式调用了它)并按预期进行。但是,当我同时运行所有单元测试时,它根本不会输入component.getObj()(什么都不会记录到控制台)。我无法理解的是这种行为。这里重要的一点是,component.getObj()中调用的服务类在测试中被另一个类模拟(如代码所示),但相关的点(在我看来)是component.getObj()本身没有被调用。当仅运行组件测试时,将按预期返回模拟对象。如果我在测试中设置了间谍,则即使我运行所有测试,也可以代替component.getObj()(通过记录确认)来调用伪造方法。对于如何解决或澄清为什么发生的任何帮助,将不胜感激!

代码:
component.spec.ts:

it('should setup status tooltip', () => {
fixture.detectChanges();
component.field = {
  id: -1,
  map: {
    objId: 22,
    objName: "Running",
    // other properties
  },
  someObj: []
};

component.getObj(); //this is the line in question
fixture.detectChanges();
//expectations are here
});

component.ts

getObj() {
    this.myService.getObjects().subscribe(
      res => {
        this.ObjList = res;
        //do something
      },
      err => {
        let errorMsg = "Error!";
        //do something
      });
  }

MockMyService

export class MockMyService {
    // other functions
    getObjects() {
        return Observable.of(objList); //objList is defined earlier
    }
}

0 个答案:

没有答案