如何使用 jest 测试 HttpService.Post 调用

Posted

技术标签:

【中文标题】如何使用 jest 测试 HttpService.Post 调用【英文标题】:How to test HttpService.Post calls using jest 【发布时间】:2020-05-08 16:19:23 【问题描述】:

我正在调用 Nestjs 服务中的 API,如下所示,

import  HttpService, Post  from '@nestjs/common';

export class MyService 

constructor(private httpClient: HttpService) 

public myMethod(input: any) 
    return this.httpClient
      .post<any>(
        this.someUrl,
        this.createObject(input.code),
         headers: this.createHeader() ,
      )
      .pipe(map(response => response.data));
  

我如何模拟/监视对 this.httpClient.post() 的调用以在不触及实际 API 的情况下返回响应?

describe('myMethod', () => 
    it('should return the value', async () => 
      const input = 
        code: 'value',
      ;
      const result = ['test'];

      // spyOn?

      expect(await myService.myMethod(input)).toBe(result);
  );
);

【问题讨论】:

【参考方案1】:

使用 spyOn 让它工作。

describe('myMethod', () => 
    it('should return the value', async () => 
      const input = 
        code: 'mock value',
      ;

      const data = ['test'];

      const response: AxiosResponse<any> = 
        data,
        headers: ,
        config:  url: 'http://localhost:3000/mockUrl' ,
        status: 200,
        statusText: 'OK',
      ;

      jest
        .spyOn(httpService, 'post')
        .mockImplementationOnce(() => of(response));

      myService.myMethod(input).subscribe(res => 
        expect(res).toEqual(data);
      );
  );
);

【讨论】:

谢谢!不要忘记按照***.com/a/55212136/5869296 中的说明调用 done() 这只有在 httpService 被暴露 /public 时才有效,而在大多数情况下它不应该如此。最好直接使用模拟对象或笑话自动模拟功能来模拟它。

以上是关于如何使用 jest 测试 HttpService.Post 调用的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Jest 测试样式

如何使用 Jest 测试身份验证标头?

如何使用 Jest 测试导入/导出?

如何使用 Jest 测试 Thunk 操作?

如何使用 jest 和酶测试 API 调用?

如何创建 GitHub Action 以使用 Yarn 运行 Jest 测试?