Uncaught Error: Uncaught (in promise): TypeError: this.xxxService.getSomething(...).toPromise is not a function

问题描述

在组件中:

private xxxService: XxxService,const xxxList = await this.xxxService.getSomething(this.someid).toPromise();

在测试文件 component.spec.ts 中:

import {Observable,of} from 'rxjs';
const xxxServiceStub = {
    getSomething: () => Promise.resolve([])
  };
 beforeEach((async(next) => {
    await Testbed.configureTestingModule({
      declarations: [someComponent],imports: [
       ....
      ],providers: [
        {provide: XxxService,useValue: xxxServiceStub},]
    }).compileComponents();
    next();
  }));

API:

public getSomething(someid): Observable<xxxRef[]> {
    return this.httpClient
      .get<xxxRef[]>(
        ${environment.url}/api/xxx?someid=${someid},{
          observe: 'response'
        }
      ).pipe(
        map(response => {
          return response.body;
        })
      );
  }

界面:

export interface xxxRef {
  name: string;
  id: number;
  description?: string;
}

测试通过,但 Karma 的控制台有错误

zone-evergreen.js:798 Uncaught Error: Uncaught (in promise): TypeError: this.xxxService.getSomething(...).toPromise is not a function

解决方法

您需要从 getSomething 方法返回一个 Observable,但您返回的 Promise.resolve 不是 Observable,这就是您收到错误的原因。

将您的模拟方法更改为此

import { of } from 'rxjs';

...
const xxxServiceStub = {
    getSomething: () => of([]) // this returns observable 
};

toPromise reference

mock toPromise

,

在不知道 xxxServiceStub 是什么的情况下很难告诉您确切的问题,但是,这可能是因为您没有返回 Observable(它具有 .toPromise功能

你伪造的 xxxService.getSomething 需要看起来像这样才能在规范中工作:

getSomething(id: number): Observable<any> {
  return of(true);
}

另一种方法是使用间谍:

spyOn(xxxService,'getSomething').and.callFake(() => of(true));