Ошибка Mocked Http get service request для модульного теста angular из-за ввода

#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. Я был на правильном пути, но пока не мог решить ее правильно. БОЛЬШОЕ ВАМ СПАСИБО!