как юнит тестировать подписку на BehaviourSubject в угловых - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть 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 Ответ

0 голосов
/ 20 декабря 2018

Проблема была в том, как я создавал Result.Я не должен был использовать .toString с userSignInState.Из другого вопроса, который я опубликовал в SO, «ссылка на .toString без () - это просто ссылка на эту функцию, поэтому, если вы зарегистрируетесь, вы получите код для этой функции».Кроме того, «toString () не будет работать, так как userSignInState не имеет значимого строкового представления и по умолчанию имеет значение [object Object]».Я удалил toString и код работал как additional-info типа any

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...