шпионить за наблюдаемым внутренним методом

Я хочу убедиться, что this.isLoggedIn установлен путем вызова retrieveToken.

Я также хотел бы шпионить за this.authService.currentToken, возможно ли это или есть другой способ проверить, что наблюдаемые подписаны?

компонент

 public retrieveToken(): void {
        this.authService.currentToken
          .subscribe(status => {
            if (status) {
              this.isLoggedIn = true;
            }
          });
      }

сервис

export class AuthenticationService {
    public currentTokenSubject: BehaviorSubject<any>;
    public currentToken: Observable<any>;

    constructor(private http: HttpClient) {
        this.currentTokenSubject = new BehaviorSubject<any> ());
        this.currentToken = this.currentTokenSubject.asObservable();
    }

}

спецификация

 it('', () => {
    const fixture = TestBed.createComponent(AppComponent);
    const app = fixture.debugElement.componentInstance;
    const tokenSpy = spyOn(authService, 'currenToken').and.returnValue(of({}));
    app.retrieveToken();
    expect(tokenSpy).toHaveBeenCalled();
  });

сообщение об ошибке

Ошибка:: метод currenToken () не существует. Использование: spyOn (,)


person Joel    schedule 07.03.2019    source источник
comment
spyOn используется для имитации вызовов методов. Ваш currentToken является собственностью. Если бы у вас был метод доступа get, вы могли бы использовать spyOnProperty. Поскольку это не тот случай, вы можете создать фиктивный класс или свойство, которое затем предоставите в TestBed вашего файла спецификации для реального AuthService, используя {provide: Service, useClass / useMethod MockService}   -  person Erbsenkoenig    schedule 07.03.2019


Ответы (1)


Вы можете определить макет службы внутри своего тестового файла спецификации, например:

class AuthenticationServiceMock extends AuthenticationService {
   // here you can define what you need, in your case it is currentToken
   // which you need 
}

затем в TestBed, где вы устанавливаете своих провайдеров, вам нужно указать, что вы хотите использовать созданный вами фиктивный класс

providers: [
            {
                provide: AuthenticationService,
                useValue: new AuthenticationServiceMock()
            },
            ]

Теперь внутри вашего тестового примера, когда вы вызываете app.retrieveToken (); currentToken должен быть доступен.

Я надеюсь, что это поможет вам :)

person Nemanja    schedule 07.03.2019