我正试图用单元测试覆盖一个提供程序,该测试在返回时包含一个带有管道的映射。但茉莉说,不知何故,这种方法并不是一种功能。
用于Hotjar模块的提供程序。
这是我的测试。
fdescribe('UserRolesProvider', () => {
let service: UserRolesProvider;
let userServiceSpy: { onUserEvent: jasmine.Spy };
beforeEach(waitForAsync(() => {
userServiceSpy = jasmine.createSpyObj('UserService', ['onUserEvent']);
TestBed.configureTestingModule({
providers: [UserRolesProvider, { provide: UserService, useValue: userServiceSpy }],
});
service = TestBed.inject(UserRolesProvider);
}));
it('should have a service instance', () => {
expect(service).toBeDefined();
});
it('showContents should return true for an Admin Role', (done) => {
const attributes = {
roles: ['ROLE_ADMIN'],
};
service.getUserAttributes().subscribe((state) => {
expect(state.attributes).toEqual(attributes);
done();
});
spyOn(userServiceSpy, 'onUserEvent').and.returnValue(of(attributes));
service.getUserAttributes(); // invoke after
expect(service.getUserAttributes).toHaveBeenCalled();
});
});
这是我的TS
@Injectable({
providedIn: 'root',
})
export class UserRolesProvider implements HotjarUserAttributesLoader {
constructor(private userService: UserService) {}
getUserAttributes(): Observable<HotjarUserAttributes> {
return this.userService.onUserEvent().pipe(
map((user) => {
return {
id: user.id,
attributes: {
roles: user.roles,
},
};
})
);
}
}
这就是用户服务。
private userEvent$ = new ReplaySubject<User>(1);
onUserEvent(): ReplaySubject<User> {
return this.userEvent$;
}
HotJarUserAttributes它是一个接口
export interface HotjarUserAttributes {
id: string;
attributes: any;
}
您已经使用以下行发现了依赖项:
userServiceSpy = jasmine.createSpyObj('UserService', ['onUserEvent']);
但你还没有具体说明这种可观测的结果会返回什么。正如我所看到的,您正在返回一个user类型的对象,该对象在组件代码中有两个属性id
和roles
。您也可以通过在测试用例中返回相同的类型来解决这个问题。只需在间谍创建后添加以下行即可。
const returnedObject: HotjarUserAttributes = {
id: '1',
attributes: { roles: [1, 2] },
}
userServiceSpy.onUserEvent.and.returnValue(of(returnedObject))