在我的组件的ngOnInit()中,我调用一个getAllUsers方法,该方法进行UserService promise调用。我想简单地做这个测试:
it('should get initialized', async(inject([MockBackend], (backend: MockBackend) => {
spyOn(component, "getAllUsers")
component.ngOnInit()
expect(component.getAllUsers).toHaveBeenCalled()
expect(component.users).not.toBeNull()
expect(component.users.length).toBe(2)
})))
所以在我的代码中我有这个:
ngOnInit() {
this.getAllUsers()
}
使用像这样的getAllUsers:
getAllUsers() {
this._userService.getAllUsers().toPromise().then(
data => {
this.users = data["users"]
}, error => {}
)
}
在我的MockUserService中,我有这样的getAllUsers():
getAllUsers(): Observable<any> {
return Observable.of({
"success": true,
"users": [ User.testUser(), User.testUser() ]
})
}
问题是我在代码中的某些位置放了一些console.info,我甚至可以看到在进入component.getAllUsers之前调用了expect行。
我如何等待ngOnInit()完成?谢谢!
答案 0 :(得分:2)
您应该在ngOnInit
完成运行之前等待。使用fixture.whenStable()
。完成异步调用后,将执行该块中的代码。
it('should get initialized', async(inject([MockBackend], (backend: MockBackend) => {
fixture = TestBed.createComponent(ComponentName); // replace with the name of your component
spyOn(component, "getAllUsers")
component.ngOnInit();
fixture.detectChanges();
fixture.whenStable().then(() => {
expect(component.getAllUsers).toHaveBeenCalled()
expect(component.users).not.toBeNull()
expect(component.users.length).toBe(2)
});
})))