Создание шпиона для HttpClient post создает ошибку возвращаемого значения

#javascript #angular #typescript #jasmine

#javascript #угловой #typescript #jasmine

Вопрос:

У меня есть служба, которая принимает HttpClient service в качестве значения, я хотел бы шпионить за post методом этого класса, поэтому я создал шпиона, который выглядит следующим образом:

 spyOn(httpClient, 'post').and.returnValue(() => new Subject<any>().asObservable());
  

Однако я получаю следующую ошибку:

 Argument of type '() => Observable<any>' is not assignable to parameter of type 'Observable<unknown>'.
  Type '() => Observable<any>' is missing the following properties from type 'Observable<unknown>': _isScalar, source, operator, lift, and 6 more.
  

Вот спецификация, из которой она взята:

 describe('GraphQLClientService', () => {
  let service: GraphQLClientService;
  let httpClient: HttpClient;
  let postSpy: any;

  beforeEach(() => {
    httpClient = jasmine.createSpyObj('HttpClient', []);
    postSpy = spyOn(httpClient, 'post').and.returnValue(() => new Subject<any>().asObservable());
    service = new GraphQLClientService(httpClient);
  });
});
  

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

1. Почему вы шпионите httpClinet ? вы предполагаете предоставить httpClintModule в ваших .spec провайдерах макет сервиса.

2. @KamranKhatti Не могли бы вы опубликовать пример?

3. @KamranKhatti Веб-сайт angular делает это так, как я это сделал: angular.io/guide/testing-services#services-with-dependencies

4. Он никогда не делал того же самого, он вводит другую пользовательскую службу для master service HttpClient не является пользовательской службой, мы вводим ее в метод read, и нет необходимости издеваться над ним, вместо этого он издевается над методом, в котором мы используем httpclient get, post и т.д.

Ответ №1:

Вы возвращаете функцию, которая возвращает наблюдаемое вместо только наблюдаемого

 postSpy = spyOn(httpClient, 'post').and.returnValue(new Subject<any>().asObservable());
  

или

 postSpy = spyOn(httpClient, 'post').and.returnValue(of({}));