在开玩笑中模拟 toPromise 函数 - 得到 .toPromise 不是一个函数

Tuz*_*Tuz 4 node.js promise jestjs nestjs

我有一个来自 Nestjs/common 的 httpService

我正在使用如下内容:

const response = await this.httpService.post(`${this.api}/${action}`, data).toPromise();
Run Code Online (Sandbox Code Playgroud)

在我的笑话规范文件(单元测​​试)中。我想嘲笑这项服务

   httpServiceMock = {
      post: jest.fn()
    };

it('should start', async () => {

    const serviceResult = await service.start(data);

});
Run Code Online (Sandbox Code Playgroud)

我遇到了这个错误:

TypeError: this.httpService.post(...).toPromise is not a function
Run Code Online (Sandbox Code Playgroud)

我还尝试添加一个承诺结果,例如:

 const promise = Promise.resolve('result');
 httpServiceMock.post.mockResolvedValue(promise);
Run Code Online (Sandbox Code Playgroud)

也尝试过:

it('should start', async () => {

    const mockObservable = Promise.resolve({
        toPromise: () => {
          console.log('toPromise called');
        }
      })

    httpServiceMock.post.mockImplementation(() => mockObservable);

    const serviceResult = await service.start();

});
Run Code Online (Sandbox Code Playgroud)

我的问题是如何模拟承诺并返回响应或异常

A J*_*lay 8

返回值httpService.post需要返回一个Observable<AxiosResponse<T>>,其中包含一个属性toPromise,它是一个函数。你的模拟返回一个已解决的承诺,而它需要返回一个假的 Observable。

Observable 是立即返回的,因此post实现可以只返回一个原始值,但toPromise需要返回一个 Promise。

返回正确形状的对象以消除此错误:

const mockObservable = {
  toPromise: () => Promise.resolve('result')
}
httpServiceMock.post.mockImplementation(() => mockObservable);
Run Code Online (Sandbox Code Playgroud)