Как юнит тестировать подписку на 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

Другие вопросы по тегам