注意:下面的描述中提供了相关的代码段。
我正在使用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
}
}