Nest JS - 为返回 Observable Axios 响应的函数编写 Jest 测试用例的问题

Posted

技术标签:

【中文标题】Nest JS - 为返回 Observable Axios 响应的函数编写 Jest 测试用例的问题【英文标题】:Nest JS - Issue writing Jest Test Case for a function returning Observable Axios Response 【发布时间】:2019-08-07 13:50:26 【问题描述】:

我对 NestJS + Typescript + RxJs 技术栈还很陌生。我正在尝试使用 Jest 为我的一个功能编写单元测试用例,但不确定是否正确执行。

component.service.ts

public fetchComponents(queryParams) 
  const url = this.prepareUrl(queryParams);

  const data$ = this.httpService.get(url);

  return data$
    .pipe(map(( data ) => data));

component.service.spec.ts

测试用例有效并通过

describe('fetchComponents', () => 
  const query = 
    limit: 10,
    offset: 0
  ;

  const result: AxiosResponse = 
    data: 'Components',
    status: 200,
    statusText: 'OK',
    headers: ,
    config: 
  ;
  it('should return Dummy Data when called successfully', () => 
    componentService.prepareUrl = jest.fn();

    jest.spyOn(httpService, 'get').mockImplementation(() => of(result));

   componentService.fetchComponents(market, query)
    .subscribe(
      (res) => 
        expect(res).toEqual('Components');
      
    );
  );
);

您能否就我应该如何测试此功能提供建议和指示。也没有使用像marbel-rx这样的库 我不确定我是否正确测试它。还有什么我应该测试的吗?

【问题讨论】:

【参考方案1】:

由于Observables 是异步的,您必须在最后执行的expect 之后添加异步done 参数并调用done()。否则,jest 将在调用subscribe() 后完成测试运行,而不等待subscribe 的回调异步执行。尝试通过例如期望'Komponents' 使您的测试失败。测试不会失败。

另外,我建议尽可能使用mockImplementationOnce 而不是mockImplementation,以避免在以后的调用中隐式重用模拟行为,从而创建隐式依赖关系。

it('should return Dummy Data when called successfully', done => 
// Add done parameter                                   ^^^^
  componentService.prepareUrl = jest.fn();

  jest.spyOn(httpService, 'get').mockImplementationOnce(() => of(result));
// Prefer mockImplementationOnce                   ^^^^

  componentService.fetchComponents(market, query)
    .subscribe(
      (res) => 
        expect(res).toEqual('Components');
        done();
//      ^^^^^^  Call done() when test is finished
      
    );
);

【讨论】:

感谢代码审查。我实际上在我的代码中编写了一个 catchError() 块,并通过调用不正确的 URL 来测试它。尽管如此,Jest 仍在抱怨那段代码无法访问。在我添加 done() 回调的那一刻,那段代码在我的测试中变得可以访问,现在它是 100%。非常感谢

以上是关于Nest JS - 为返回 Observable Axios 响应的函数编写 Jest 测试用例的问题的主要内容,如果未能解决你的问题,请参考以下文章

Nest JS GraphQL“不能为非空返回null” [重复]

Nest.js Auth Guard JWT 身份验证不断返回 401 未授权

nest.js swagger返回类型code

Nest.JS 和 Observables

从 Nestjs 中的 observable grpc 服务获取数据,

如何在 Nest.js 中参考打字稿源打印堆栈跟踪