卡玛等待无效的承诺完成

时间:2017-07-21 08:46:45

标签: angular karma-jasmine

在我的组件的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()完成?谢谢!

1 个答案:

答案 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)
     });
  })))