gpt4 book ai didi

unit-testing - 尝试从单元测试的获取中模拟响应主体

转载 作者:行者123 更新时间:2023-12-02 17:47:57 25 4
gpt4 key购买 nike

我对 sinon 和 proxyquire 还很陌生,我想我已经阅读了这里的所有答案,但我仍然没有找到我需要的东西。不管怎样,这是我的代码的清理版本。

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)))
});
});

因此,获取调用现在返回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 但所有使用该模块的测试直接而不是通过 fetch 间接命中 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()

如果不起作用,请告诉我。

关于unit-testing - 尝试从单元测试的获取中模拟响应主体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58493444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com