我目前正在将node-fetch
和nock
用于位于角项目顶部的Express服务器。
我有以下调用api的中间件:
export const middleware = async(response: any) => {
try {
const result = await fetch(url).then(res => res.json())
return response.status(200).json(result);
} catch(err) {
logger.error({eventId: 'get-content', err});
return response.status(500)
}
}
我的测试如下:
describe('API service', () => {
let response, scope;
beforeEach(() => {
response = {
status(s) { this.statusCode = s; return this; },
json(result) { this.res = result; return this; },
};
})
afterEach(() => {
nock.restore();
})
it('should return a 200 response from successful call api', (done) => {
scope = nock(url)
.get(/.*/)
.reply(200, {data: 'content'})
middleware(response).then(data => {
expect(response.status).toEqual(200);
expect(response.data).toEqual('content');
scope.isDone();
done();
})
})
})
但是,nock并未模拟来自中间件功能的data
响应。相反,我必须使用scope
来访问其参数。
中间件功能就像nock从未嘲笑其响应一样。为什么会发生这种情况?我是否缺少配置?
我正在使用业力赛跑者进行测试。
答案 0 :(得分:0)
Nock通过重写Node的http.request函数来工作。此外,它还会覆盖http.ClientRequest,以覆盖直接使用它的模块。
不幸的是,似乎fetch
没有使用http.request
或http.ClientRequest
,这意味着请求从未被nock
拦截。
更好的方法可能是使用fetch-mock
之类的库来模拟fetch
。