我目前正在为我的一个组件编写单元测试。特别是我有login(): void
功能。这是简化的逻辑:
login(): void {
this.showSpinner = true;
this.userService.login(loginData)
.subscribe(result => {
this.showSpinner = false;
}
)
}
我正在努力编写一个测试,showSpinner
在true
调用userService.login
.
这是我的测试:
it('should display the spinner when the form is being saved',
inject([TestComponentBuilder], fakeAsync((tcb: any) => {
createComponent(tcb).then((fixture:ComponentFixture<any>) => {
fixture.componentInstance.login();
expect(fixture.componentInstance.showSpinner).toBe(true);
tick();
});
})));
});
这个测试失败了,因为.subscribe
得到解决/立即运行(我尝试在我的组件中注释掉this.showSpinner = false
,并且测试通过了)。
在我的userService
模拟中,对于方法模拟,我有以下内容login
:
this.loginSpy = this.spy('login').andReturn(Observable.of(this));
this
在哪里mockUserService
。
我有信心我正在嘲笑userService
,特别是正确的login
方法userService
,因为我对该组件进行了其他测试,这些测试表现正确。
我也试过Observable.of(this).delay(1)
从我的间谍那里回来,然后打电话给tick(1)
我的测试。然而,这会导致不一致的行为,因为有时我的测试通过了,但其他时候我收到一条错误消息:
Error: 1 periodic timer(s) still in the queue.
如何测试前面的逻辑.subscribe()
?