spyOn 找不到用于监视 start() 的对象
Posted
技术标签:
【中文标题】spyOn 找不到用于监视 start() 的对象【英文标题】:spyOn could not find an object to spy upon for start() 【发布时间】:2017-02-27 15:24:53 【问题描述】:我正在使用 angular-cli 测试框架。
在我的组件中,我使用了“ng2-slim-loading-bar”节点模块。
submit()
this._slimLoadingBarService.start(() =>
);
//method operations
现在当我测试这个组件时,我已经将 spyOn 这个服务应用为:
beforeEach(() =>
let slimLoadingBarService=new SlimLoadingBarService();
demoComponent = new DemoComponent(slimLoadingBarService);
TestBed.configureTestingModule(
declarations: [
DemoComponent
],
providers: [
provide: SlimLoadingBarService, useClass: SlimLoadingBarService
],
imports: [
SharedModule
]
);
);
it('should pass data to servie', () =>
spyOn(slimLoadingBarService,'start').and.callThrough();
//testing code,if I remove the above service from my component, test runs fine
);
但它不起作用。
它抛出以下错误:
spyOn 无法为 start() 找到要监视的对象
【问题讨论】:
【参考方案1】:使用 let 声明 slimLoadingBarService,您将其范围限制为 beforeEach 回调范围。用 var 声明它,或者更好,在正确的 describe() 块之后声明它,并在 beforeEach 回调函数中设置它的内容:
describe("some describe statement" , function()
let slimLoadingBarService = null;
beforeEach( () =>
slimLoadingBarService=new SlimLoadingBarService();
);
it('should pass data to service', () =>
spyOn(slimLoadingBarService,'start').and.callThrough();
//testing code,if I remove the above service from my component, test runs fine
);
);
【讨论】:
+1。您可以使用slimLoadingBarService = TestBed.inject(SlimLoadingBarService);
(对于Angular 9)在beforeEach 中注入该服务,而不是那里的行。为了利用打字稿,您可以在描述之后将变量定义为let mockSlimLoadingBarService: SlimLoadingBarService;
,以便输入。您必须创建一个名为 SlimLoadingBarService
的接口,并可能将其放在一个 slim-loading-bar-service.model.ts 文件中,但它有助于使事情井井有条,并且可以在错误发生之前将其清除。【参考方案2】:
这是由于 beforeEach 中没有声明
angular 10 之后的更新语法
beforeEach(() =>
slimLoadingBarService = TestBed.get(SlimLoadingBarService);
);
角度 10 之前
beforeEach(() =>
slimLoadingBarService = TestBed.get(SlimLoadingBarService);
);
【讨论】:
从 Angular 10 开始,TestBed.inject(<class-name>)
是语法。
beforeEach(() => slimLoadingBarService = TestBed.get<SlimLoadingBarService>(SlimLoadingBarService); );
以上是关于spyOn 找不到用于监视 start() 的对象的主要内容,如果未能解决你的问题,请参考以下文章