#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({}));