【发布时间】:2019-01-01 11:39:51
【问题描述】:
我有一个 UserManagementService,它公开了一个 BehaviourSubject 的 Observable。
this.userSignInState$ = this.signInStateSubject.asObservable();
userSignInState$ 是公开的,而signInStateSubject 是私有的。
我订阅了nav 组件中的userSignInState$。
constructor(public userManagementService: UserManagementService, private fb:FormBuilder, private helper:HelperService) {
this.userSignInStateSubscription = this.userManagementService.userSignInState$.subscribe(
(result:Result)=> {
console.log("In nav - result from user signin state ",result);
let subscribed:UserSigninState = result.additionalInfo;
console.log("new user signin state received:", subscribed);
this.userLoggedIn = subscribed.isSignedIn;
if(subscribed.isSignedIn && subscribed['additional-info'] !== ''){
this.profile = JSON.parse(subscribed['additional-info']) as UserProfileAPI
}
if(!subscribed.isSignedIn && subscribed['additional-info'] !== ''){
// let error:ServerResponseAPI = JSON.parse(subscribed['additional-info']) as ServerResponseAPI
//let errorMessage:string = this.helper.userFriendlyErrorMessage(error);
this.navEvent.emit(new NavContext(subscribed['additional-info']));
}
},
(error:ServerResponseAPI)=>{
console.log("got error from the Observable: ",error);
let errorMessage:string = this.helper.userFriendlyErrorMessage(error);
this.navEvent.emit(new NavContext(errorMessage));
// this.userloggedIn =false;
},
()=>{ //observable complete
console.log("observable completed")
//this.userloggedIn =false;
});
}
我想对nav 进行单元测试。作为规范的一部分,我想使用signInStateSubject 中的next 并检查nav 是否接收到next 中发送的消息。但我不能这样做,因为signInStateSubject 是私人的。如果我将signInStateSubject 公开,我可以这样做,但这听起来不对。
我编写了以下规范,但只有当我将 signInStateSubject 公开时它才有效。
fit('should subscribe to user sign in state observable',()=>{
let userManagementService = TestBed.get(UserManagementService);
let navComponent:NavComponentComponent = component;
console.log('component is ',navComponent);
navComponent.userLoggedIn = false;
let dummyUserProfile = new UserProfileAPI(new User('fn','ln','test@test.com'));
userManagementService.signInStateSubject.next(new Result('success',(new UserSigninState(true,JSON.stringify(dummyUserProfile ))))); //THIS WORKS ONLY IF signInStateSubject IS PUBLIC
expect(navComponent.userLoggedIn).toBe(true)
});
【问题讨论】:
标签: jasmine rxjs angular6 angular-test