【问题标题】:How to create an ArrayBuffer Variable in Angular unit test, Jasmine/Karma如何在 Angular 单元测试 Jasmine/Karma 中创建 ArrayBuffer 变量
【发布时间】:2019-09-22 09:14:56
【问题描述】:

您好,我有一个从后端下载 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 类型的变量 测试一下这个问题就解决了

对此有什么想法吗?

【问题讨论】:

    标签: javascript angular typescript unit-testing karma-jasmine


    【解决方案1】:

    请注意,带有参数responseType: 'arraybuffer'observe: 'response'post 方法返回值Observable&lt;HttpResponse&lt;ArrayBuffer&gt;&gt;,而不是直接提供的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');
      });
    

    【讨论】:

    • 谢谢,1 个简单的问题,我的 IDE 说'of' Rxjs 已被弃用,你有什么新的替代品吗?从“rxjs/internal/observable/of”导入 {of};
    • 像这样导入import { of } from 'rxjs';
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-14
    • 2017-05-27
    • 1970-01-01
    • 2021-09-20
    相关资源
    最近更新 更多