Как создать переменную ArrayBuffer в модульном тесте Angular, Жасмин / Карма - PullRequest
0 голосов
/ 03 мая 2019

Привет, у меня есть функция, которая загружает файл Excel из бэкэнда

component.ts

 getExcelExport(resultsFilterRootObject: ResultsFilterRootObject) {
    return this.http.post(urls.getExcelExportCPPMetrics , resultsFilterRootObject, {
      responseType: 'arraybuffer',
      observe: 'response'
    })
      .pipe(
        tap(
          data => {
            const blob = new Blob([data.body], {type: 'application/vnd.ms-excel'});
            const filename = 'vehicle-metrics-template.xls';
            FileSaver.saveAs(blob, filename);
          },
          catchError(MetricsService.handleError)
        )
      );
  }

component.spec.ts

  it('should download Excel ', () => {

  //  const expectedResult: ArrayBuffer = new ArrayBuffer(8); Tried this fails too
    const expectedResult = new TextEncoder();
    expectedResult.encode("This is a string converted to a Uint8Array");

    httpClientSpy.post.and.returnValue(asyncData(expectedResult));

    metricsService.getExcelExportCPPMetrics(resultsFilterRootObject).subscribe(
      heroes => expect(heroes).toEqual(expectedResult, 'expected VehicleSalesResultRootObject'),
      fail
    );
    expect(httpClientSpy.post.calls.count()).toBe(1, 'one call');
  });

Я получаю сообщение об ошибке TS2345: Аргумент типа 'TextEncoder' нельзя назначить параметру типа 'Expected<HttpResponse<ArrayBuffer>>'.

Type 'TextEncoder' is missing the following properties from type 'ObjectContaining<HttpResponse<ArrayBuffer>>': jasmineMatches, jasmineToString

В основном, если я могу создатьДля переменной типа ArrayBuffer в модульном тесте эта проблема будет решена

Есть идеи по этому поводу?

1 Ответ

1 голос
/ 06 мая 2019

Обратите внимание, что метод post с параметрами responseType: 'arraybuffer' и observe: 'response' возвращает значение Observable<HttpResponse<ArrayBuffer>>, которое не является прямым ArrayBuffer, как указано здесь:

post(url: string, body: any | null, options: {
    headers?: HttpHeaders | {
        [header: string]: string | string[];
    };
    observe: 'response';
    params?: HttpParams | {
        [param: string]: string | string[];
    };
    reportProgress?: boolean;
    responseType: 'arraybuffer';
    withCredentials?: boolean;
}): Observable<HttpResponse<ArrayBuffer>>;

Что вы можете сделать, это вернуть Observable с простым объектом, у которого есть свойство, которое вы используете - body:

  it('should download Excel ', () => {
    const expectedResult: ArrayBuffer = new ArrayBuffer(8);
    // httpClientSpy.post.and.returnValue(asyncData(expectedResult));
    httpClientSpy.post.and.returnValue(of({body: expectedResult})); // Or that below one if "asyncData" return Observable

    metricsService.getExcelExportCPPMetrics(resultsFilterRootObject).subscribe(
      data => expect(data.body).toEqual(expectedResult, 'expected VehicleSalesResultRootObject'),
      fail
    );
    expect(httpClientSpy.post.calls.count()).toBe(1, 'one call');
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...