unit-testing - 尝试从获取中模拟响应主体以进行单元测试
问题描述
我对 sinon 和 proxyquire 还很陌生,我想我已经阅读了 SO 上的所有答案,但我仍然没有找到我需要的东西。无论如何,这是我的代码的净化版本。
const fetch = require('node-fetch');
async function deleteID(id, endpoint) {
try {
let url = `${endpoint}/delete/${id}`;
let res = await fetch(url, { method: 'DELETE' });
res = await res.json(); // <---- THIS FAILS WHEN fetch IS MOCKED
// do stuff with res
} catch (err) {
logger.error(`Error: ${JSON.stringify(err)}`);
}
}
这很简单,它使用 node-fetch 来访问一个 url,然后在请求成功或失败时执行一些操作。这是我的测试,让我们为 fetch 设置模拟:
const proxyquire = require('proxyquire').noCallThru();
const sinon = require('sinon');
beforeEach((done) => {
const validResponse = {
status: 200,
data: 'hello, world\n'
};
deleteProxy = proxyquire('./delete', {
'node-fetch': sinon.stub().returns(Promise.resolve(JSON.stringify(validResponse)))
});
});
所以 fetch 调用现在返回validResponse而不是访问服务器。这是我的测试:
it.only('should delete', async () => {
try {
deleteProxy.deleteID('id', 'endpoint');
} catch (err) {
expect(err.message).to.have.lengthOf.at.least(0);
}
});
这失败了,因为 res 只是一个具有状态和数据的对象,它不是具有 Body 等的正确响应......我们的其余代码使用node-mocks-http但所有使用该模块的测试都直接命中了 url ,而不是间接地,通过获取,就像我在上面所做的那样。
如何创建模拟响应以适应上述测试,或者我应该使用不同的方法?
解决方案
通过查看代码和我对 sinon 的经验,我会说这不是实际的 HTTP 响应,所以你也必须模拟json()
。在beforeEach
方法:
const body = {
status: 200,
data: 'hello, world\n'
};
var validResponse = { json: () => { return body } };
deleteProxy = proxyquire('./delete', {
'node-fetch': sinon.stub().returns(Promise.resolve(validResponse))
});
试试看JSON.stringify()
让我知道它是否不起作用。
推荐阅读
- azure-devops - Azure DevOps 团队回顾 - 重置投票计数
- r - 基于列名的多列总和
- python - 为什么cvxpy中的求解器ECOS不能解决这个LP问题?
- python - Fail2ban Regex - 日志文件中的行不匹配
- c - mkdir() 的多个问题
- python - 从数据框中创建一个包含 2 列的二维数组并循环获取值
- python - 局部变量可能在赋值之前被引用
- c - 如何在调试模式下在 NetBeans 中获取 printf 消息并且构建目标是 RaspberryPi?
- python - 使用 pubsub 消息启动其他 GCF 的 Google 云功能以“状态:连接错误”结尾
- html - 如何在 JQuery 中将变量从一个函数传递到另一个函数