包含具有Replay Subject的服务的提供程序的单元测试无法读取未定义的管道



我正试图用单元测试覆盖一个提供程序,该测试在返回时包含一个带有管道的映射。但茉莉说,不知何故,这种方法并不是一种功能。

用于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类型的对象,该对象在组件代码中有两个属性idroles。您也可以通过在测试用例中返回相同的类型来解决这个问题。只需在间谍创建后添加以下行即可。

const returnedObject: HotjarUserAttributes = {
id: '1',
attributes: { roles: [1, 2] },
}
userServiceSpy.onUserEvent.and.returnValue(of(returnedObject))

最新更新