我无法测试我的NestJs服务。我写了一个方法,它执行GET http请求:
getEntries(): Observable<Entries[]> {
Logger.log(`requesting GET: ${this.apiHost}${HREF.entries}`);
return this.http.get(`${this.apiHost}${HREF.entries}`).pipe(
catchError((error) => {
return throwError(error);
}),
map(response => response.data)
);
}
我想为此方法编写一个单元测试。此单元测试应涵盖此方法的所有行。 我尝试使用“ nock”包来模拟此http请求,但是无论我如何尝试,覆盖结果始终是相同的。
return throwError(error);
map(response => response.data);
这两条线被发现了。
这是我的测试文件:
describe('getEntries method', () => {
it('should do get request and return entries', () => {
nock('http://localhost:3000')
.get('/v1/entries')
.reply(200, {
data: require('../mocks/entries.json')
});
try {
const result = service.getEntries();
result.subscribe(res => {
expect(res).toEqual(require('../mocks/entries.json'));
});
} catch (e) {
expect(e).toBeUndefined();
}
});
it('should return error if request failed', () => {
nock('http://localhost:3000')
.get('/v1/entries')
.replyWithError('request failed');
service.getEntries().subscribe(res => {
expect(res).toBeUndefined();
}, err => {
expect(err).toBe('request failed');
})
});
});
答案 0 :(得分:1)
我过去从未使用过nock
,但是您可以告诉HttpService
使用jest.spyOn
时该如何处理。要记住的最大事情是返回是“同步的”,因为它是可观察到的返回。要测试您的肯定案例,您可以执行以下操作
it('should do the request and get the entries', (done) => {
const httpSpy = jest.spyOn(httpService, 'get')
.mockReturnValue(of({data: require('../mocks/entries.json')}))
let data = {};
service.getEntires().subscribe({
next: (val) => {data = val},
error: (err) => { throw error; }
complete: () => {
expect(data).toEqual(require('../mocks/entries.json'))
done();
}
});
同样,对于错误路由,您可以使用throwError()
运算符。
of
和throwError
都是从rxjs
导入的。唯一需要注意的是,使用此方法,您确实需要从当前模块上下文中获取HttpService
,这与获取任何其他服务的方式类似。只需确保将其调出即可。
答案 1 :(得分:0)
感谢您的回复。该代码从根本上起作用。为了使测试正常进行,我必须进行一些更改。这是我的更改:
describe('getEntries method', () => {
it('should do get request and return entries', (done) => {
jest.spyOn(service['http'], 'get').mockReturnValue(of({data: require('../mocks/entries.json'), status: 200, statusText: 'OK', headers: {}, config: {}}));
let data = {};
service.getEntries().subscribe({
next: (val) => {data = val},
error: (err) => { throw err; },
complete: () => {
expect(data).toEqual(require('../mocks/entries.json'))
done();
}
});
});
it('should return error if request failed', (done) => {
jest.spyOn(service['http'], 'get').mockReturnValue(throwError('request failed'));
let data = {};
service.getEntries().subscribe({
next: (val) => {data = val},
error: (err) => {
expect(err).toBe('request failed');
done();
},
complete: () => {
expect(data).toBeUndefined();
done();
}
});
});
});
您必须在httpSpy mockReturnValue上模拟AxiosReponse,因此我添加了“状态”,“状态文本”,“标题”,“配置”。否则会出现类型错误。
第二部分。我像这样监视httpService:
let httpService: HttpService;
httpService = module.get(HttpService)
这不起作用。我必须监视Service的HttpService注入。
constructor(private readonly http: HttpService) {}
这就是为什么我的间谍看起来像:service ['http']。
现在,我已经完全了解了这个http请求:)
非常感谢您;) 祝你有美好的一天!