我目前正在将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从未嘲笑它的响应一样。为什么会这样呢?我是否缺少配置?
我正在使用业力赛跑者进行测试。
最佳答案
Nock通过重写Node的http.request函数来工作。同样,它也覆盖http.ClientRequest,以覆盖直接使用它的模块。
https://github.com/nock/nock#how-does-it-work
不幸的是,似乎fetch
没有使用http.request
或http.ClientRequest
意味着请求永远不会被nock
拦截。
更好的方法可能是使用fetch
之类的库模拟fetch-mock
。