我正在尝试对一个简单的函数进行单元测试,该函数发送一个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);
});
});
但这段代码并没有嘲笑fetch请求,因为当我打印响应文本时,它是API作为响应发送的"Too Many Requests",而不是被嘲笑的"Too-Many Nothings"。我是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-非全局:
全局或非全局
fetch可以由您的代码在全局或本地使用。重要的是确定哪一个应用于您的代码库,因为它将影响您使用fetch模拟
全局提取
在以下情况下,提取将是一个全局
- 在浏览器中使用本机提取(或polyfill)时
- 当node.js进程中的nodefetch被分配给global时(有时在同构代码库中使用这种模式)
默认情况下,fetch mock假设fetch是全局的,因此不再进行任何设置一旦您需要fetch mock,就需要。非全局提取库
在以下情况下,提取将不是全局
- 在node.js中使用节点获取而不分配给全局
- 在浏览器中使用fetch ponyfill
- 使用内部使用fetch ponyfill的库
- 某些构建设置会导致非全局获取,尽管情况并非总是显而易见
sandbox()方法返回一个函数,该函数可以用作drop-in替代fetch。把这个传给你选择的嘲讽库。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;
函数如何使用文件中导入的fetch
?我有一个非常基本(几乎)的VanillaJs文件,它使用import fetch from "cross-fetch";
,但这意味着我的测试文件中的fetchMock
被忽略了。切换到import "cross-fetch/polyfill";
允许我进行提供模拟提取数据的测试和我也可以进行访问真实数据的测试。