Как юнит тестировать подписку на BehaviourSubject в угловых
У меня есть UserManagementService
который выставляет Observable
из BehaviourSubject
,
this.userSignInState$ = this.signInStateSubject.asObservable();
Я подписываюсь на userSignInState
в nav
составная часть.
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
, spec
следует проверить, что component
подписывается на userSignInState$
и ручки Result
правильно. Как мне это сделать? Поскольку это юнит-тест, я не хочу использовать реальный UserManagementService
Я написал следующую спецификацию
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 ))).toString));
expect(navComponent.userLoggedIn).toBe(true)
});
но я получил ошибку Expected undefined to be true.
Я не понимаю почему userLoggedIn
не определено Я объявил это в nav
учебный класс
export class NavComponentComponent implements OnInit {
userLoggedIn:boolean;
...
}
Я установил это в ngOnInit
,
ngOnInit(){
this.userLoggedIn = false;
...
}
Я также переместил логику подписки в ngOnInit
но это тоже не работает и дает тот же результат.
1 ответ
Проблема была в том, как я создавал Result
, Я не должен был использовать .toString
с userSignInState
, Из другого вопроса, который я написал в SO
, "ссылка на.toString без () - это просто ссылка на эту функцию, поэтому, если вы зарегистрируетесь, вы получите код для этой функции". Кроме того, "toString() не будет работать, так как userSignInState не имеет значимого строкового представления и по умолчанию имеет значение [object Object]". Я удалил toString
и код работал как additional-info
имеет тип any