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 未授权