在Angular测试中,我们有时候会使用它提供的测试工具来处理异步代码。其中,next()方法被广泛使用来等待订阅事件的下一次。然而,当我们得到的响应是一个嵌套对象时,它可能会导致一些混乱。让我们来看看如何解决这个问题:
假设我们有一个服务,它拉取用户信息并返回一个响应对象,其中userName字段包含在一个嵌套的对象中:
getUserInfo(): Observable {
return this.http.get('http://example.com/user').pipe(
map(response => response['userInfo'])
);
}
现在,我们想要在我们的测试代码中使用它:
it('should retrieve user information', () => {
const userInfoService = TestBed.get(UserInfoService);
const spy = spyOn(userInfoService, 'getUserInfo').and.returnValue(
of({ userName: 'John Doe' })
);
const component = fixture.componentInstance;
component.getUserInfo();
fixture.detectChanges();
expect(component.userInfo).toEqual({ userName: 'John Doe' });
});
这个测试代码看起来非常简单明了,但是运行它会导致错误:
Expected [ Object({ userName: 'John Doe' }) ] to equal Object({ userName: 'John Doe' }).
这是因为返回的对象被包装在一个数组中,而我们所期望的对象并不在数组内。我们需要解决这个问题,让我们来看看如何修改我们的测试代码以适应嵌套对象:
it('should retrieve user information', () => {
const userInfoService = TestBed.get(UserInfoService);
const spy = spyOn(userInfoService, 'getUserInfo').and.returnValue(
of([{ userName: 'John Doe' }])
);
const component = fixture.componentInstance;
component.getUserInfo();
fixture.detectChanges();
expect(component.userInfo).toEqual({ userName: 'John Doe' });