[英]Unable to mock node-fetch using fetch-mock
我正在尝试对一个简单的函数进行单元测试,该函数发送一个get请求,接收一个响应,然后返回带有成功或失败消息的promise对象。 以下是功能:
module.exports.hello = async (event, context) => {
return new Promise((resolve, reject) => {
fetch("https://httpstat.us/429", { headers: { 'Content-Type': 'application/json' } }).then(response => {
console.log(response);
if (response.status == 200) {
return response;
} else {
throw Error(response.status + ": " + response.statusText);
}
}).then(tokenData => {
resolve({ status: 200, body: JSON.stringify({ statusText: 'Success' }) });
}).catch(error => {
reject(error.message);
});
});
};
在进行单元测试时,我正在使用fetch-mock模拟对api的调用并具有自定义响应。 以下是代码:
it('hello returns failure message', (done) => {
fetchMock.get('*', {
status: 429,
statusText: "Too Many Nothings",
headers: { 'Content-type': 'application/json' }
});
edx.hello(null, null).catch(error => {
expect(error).to.equal('429: Too Many Requests');
}).then(() => {
done();
}).catch(error => {
done(error);
});
});
但是此代码并未嘲笑提取请求,因为当我打印响应文本时,它是“太多请求”(由API作为响应发送),而不是“太多没什么”(正在被嘲笑)。 我是NodeJS的新手。 请告诉我我在做什么错。
如果您使用node-fetch
包,则它在Node.js的全局范围内不可用。 为了使fetch-mock
工作,您必须将fetch分配给global
对象(例如,通过import "node-fetch";
而不是import fetch from "node-fetch";
),或者使fetch可注入您的测试方法。
从http://www.wheresrhys.co.uk/fetch-mock/#usageglobal-non-global :
全局或非全局
您的代码可以在全局或本地使用fetch。 确定哪个代码适用于您的代码库非常重要,因为这将影响您使用fetch-mock的方式
全局获取
在以下情况下,获取将是全局的
- 在浏览器中使用本机提取(或polyfill)时
- 在Node.js进程中将节点获取分配给全局时(同构代码库中有时使用的模式)
默认情况下,fetch-mock假定fetch是全局的,因此一旦需要fetch-mock,便无需进行其他设置。 非全局读取库
在以下情况下,获取不会是全局的
- 在Node.js中使用node-fetch而不分配给global
- 在浏览器中使用fetch-ponyfill
- 使用内部使用fetch-ponyfill的库
- 一些构建设置会导致非全局获取,尽管并非总是如此
sandbox()方法返回一个函数,可用作提取的直接替代。 将此传递到您选择的模拟库中。 sandbox()返回的函数具有所有公开的fetch-mock方法,例如
const fetchMock = require('fetch-mock'); const myMock = fetchMock.sandbox().mock('/home', 200); // pass myMock in to your application code, instead of fetch, run it, then... expect(myMock.called('/home')).to.be.true;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.