Как протестировать observable, который принадлежит другому сервису в angular

#angular #karma-jasmine

#angular #karma-jasmine

Вопрос:

 $loggedIn = new BehaviorSubject<boolean>(false);

constructor(private authHttp: AuthenticatedHttp, private httpResponseHandlerService: HttpResponseHandlerService) {
    this.$loggedIn.next(!this.jwtHelper.isTokenExpired(this.getToken()));
    if (this.$loggedIn.getValue()) {
      this.checkAuth().subscribe((response) => {
        if (!response) {
          this.logout();
        }
      });
    }
  }
  

Есть $loggedIn значение, которое является наблюдаемым, и мне нужно создать значение-заглушку, которое должно быть this.$loggedIn.next(true) у меня .spec.ts .

Комментарии:

1. Если вы хотите !this.jwtHelper.isTokenExpired(this.getToken()) оценить как истинный шпионский isTokenExpired метод jwtHelper и вернуться false от шпиона.

2. Я пытался достичь значения $ isLoggedIn из .spec.ts. У меня есть служба-заглушка AuthServiceStub = { getDecodedToken() { return stubValue; }, checkAuth() { return of (false) } }, подобная этой, и я хочу получить это значение, как функции.

3. Я бы посоветовал использовать шпион для проверки того, что isTokenExpired вызывается с ожидаемым значением, но вместо этого вы могли бы использовать заглушку. Однако вам нужно заглушить правильный класс и метод, чтобы получить фиктивное истинное значение, чего вы, похоже, не делаете.

4. @BatuhanKeten Можете ли вы предоставить пример кода для component и его spec файла. Это дало бы вам быстрое решение для вас, и мне было бы легко предоставить точное решение

5. Спасибо за ваши комментарии. Я решил это, высмеивая весь класс в моем файле спецификации.

Ответ №1:

Вы могли бы шпионить за this.jwtHelper.isTokenExpired() , чтобы вернуть значение, которое вы хотите для своего теста. Единственное, что у вас может возникнуть, это то, что this.jwtHelper является закрытым членом вашего класса service, поэтому шпионить за ним будет не так-то просто. В этом случае тест может предлагать вам изменить дизайн вашего класса, создав другой закрытый метод:

 private isTokenExpired(): boolean {
    return this.jwtHelper.isTokenExpired(this.getToken());
}
  

Таким образом, вы можете отслеживать это в своем тесте:

 spyOn(yourService, 'isTokenExpired').and.returnValue(false);