#angular #unit-testing #typeerror
#угловатый #модульное тестирование #ошибка типа
Вопрос:
еще раз я пытаюсь написать тест для http get-запроса, и он завершается неудачей из-за ввода данных (по крайней мере, я так подозреваю).
Запрос, который я хочу протестировать, работает и выглядит примерно так
getTypeFilter(): Observable<Typefilter[]> {
const url = this.endpoint.getEndpoint() 'testdata/types?language=' this.language;
return new Observable<Typefilter[]>(observer => {
this.httpc.get<any[]>(url).subscribe(
(data) => {
const resultData: Typefilter[] = [];
for (const item of data) {
resultData.push(new Typefilter(item.id, item.name));
}
observer.next(resultData);
observer.complete();
},
);
});
}
выдержки из моего тестового файла выглядят следующим образом
import { TestBed } from '@angular/core/testing';
import { DataService } from './data.service';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
import { UrlService } from 'src/app/_services/url.service';
import { Typefilter } from '../_classes/typefilter';
describe('DataService', () => {
let httpMock: HttpTestingController;
let service: DataService;
let urlService: UrlService;
let mockType: Typefilter;
mockType = {id: 1, name: 'News'};
beforeEach(() => {
TestBed.configureTestingModule({
imports: [ HttpClientTestingModule]
});
httpMock = TestBed.inject(HttpTestingController);
service = TestBed.inject(DataService);
urlService = TestBed.inject(UrlService);
urlService.getEndpoint = () => ('http://someaddress/');
});
it('getTypeFilter - should return TypeFilter', () => {
service.getTypeFilter().subscribe((data) => {
expect(data).toEqual([mockType]);
});
const reqMock = httpMock.expectOne((req) => req.method === 'GET' amp;amp; req.url === urlService.getEndpoint() 'testdata/types?language=' 'de');
expect(reqMock.request.method).toBe('GET');
reqMock.flush(mockType);
});
});
Но он терпит неудачу с
«TypeError: msgtypefilterkriterium не является итеративным», что я понимаю, поскольку данные, которые я получаю в своем запросе, представляют собой массив объектов, а мои издевательские данные — это только объект. Но когда я издеваюсь над этими данными в виде массива, я получаю сообщение об ошибке: «Ожидалось, что $ [0] будет своего рода объектом, но был Typefilter({id: 1, name: ‘News’ })».
Кто-нибудь может мне помочь, как решить эту проблему?
Ответ №1:
mockType
является объектом, тогда getTypeFilter
как повторяет ответ for (const item of data)
. Поэтому reqMock.flush
также следует использовать массив.
Попробуйте reqMock.flush([mockType]);
что касается проблем с типами, то это можно было бы исправить следующим образом:
service.getTypeFilter().subscribe((data) => {
expect(data).toEqual([new Typefilter(mockType.id, mockType.name)]);
});
Комментарии:
1. Я тоже так думал, но, как уже описано, если я изменю информацию, я получу вторую ошибку: ожидаемый $ [0] будет своего рода объектом, но был Typefilter({ id: 1, name: ‘News’ })
2. да, это ожидаемо, потому что сравниваются прототипы. Поэтому
expect
следует скорректировать, я обновил ответ.3. Я был на правильном пути, но пока не мог решить ее правильно. БОЛЬШОЕ ВАМ СПАСИБО!