javascript - 单元测试:存根/重新连接服务器请求中的函数
问题描述
我想测试一个进行外部 api 调用的路由。我想存根,functionThatShouldBeStubbed
这样我就可以跳过外部 api 调用,而是专注于测试路由。
我正在使用 Sinon 并重新连线,因为如果我理解正确,我无法存根以当前方式导出的函数。
但是,似乎即使 rewire 替换了该功能,我的测试仍在进行外部 api 调用。似乎 sinon 不知道该功能已重新布线。我怎样才能使这种情况起作用?
//--------------------------
//../target.js
const functionThatShouldBeStubbed = async () => {
const results = await external_API_call();
return results;
}
module.exports = {
functionThatShouldBeStubbed,
/*more other functions*/
}
//--------------------------
//../index.js
app.use(require('endpoint.js'));
//--------------------------
//endpoint.js
const { functionThatShouldBeStubbed } = require("target.js");
router.post('endpoint', async(req, res) => {
//do lots of stuff
const results = await functionThatShouldBeStubbed();
if(results.error) { return res.status(207).send({ /*stuff */})}
//...more stuff
})
//--------------------------
//test.js
const server = require("../index.js");
const rewire = require('rewire')
const restoreTarget = rewire('../target.js');
describe("Should return appropriate error code to requester", function () {
it("Should return 207 in this case", function (done) {
const targetStub = sinon.stub().resolves({msg: 'fake results', statusCode: 207})
const targetRewired = restoreTarget.__set__("functionThatShouldBeStubbed", targetStub);
chai.request(server)
.post("/endpoint")
.send('stuff over')
.catch((error) => {
console.log("Error: ", error)
done();
})
.then((res) => {
expect(targetStub.callCount).to.equal(1);
res.should.have.status(207);
restoreTarget();
targetStub.restore();
done();
})
})
})
非常感谢!编辑:更新代码以获取更多详细信息 Edit2:再次更新代码以显示导入方法
解决方案
rewire
根据您的模块的导出方式,您根本不需要在这里。以下应该工作
//test.js
const target = require ("../target");
const server = require("../index");
describe("Should return appropriate error code to requester", () => {
it("Should return 207 in this case", done => {
const targetStub = sinon
.stub(target, "functionThatShouldBeStubbed")
.resolves({msg: 'fake results', statusCode: 207})
chai.request(server)
.post("/endpoint")
.send('stuff over')
.then(res => {
expect(targetStub.callCount).to.equal(1);
res.should.have.status(207);
targetStub.restore();
done();
})
})
})
推荐阅读
- automated-tests - 使用 amazon-congnito-identity-js 脚本的 testcafe 仅在 IE 或 Edge 上失败
- regex - 使用单词边界,除非数字前有句点,否则如何匹配一串数字?
- javascript - 如何编写此算法来搜索问题树中的下一个问题?
- html - hreflang 标记在检查工具中显示错误。自引用标签和返回标签链接没有正确设置。?
- java - 删除后元素的 ID 会怎样?
- gem5 - 如何在 gem5 checkpoints 中对不同 Segment 的不同 Checkpoints 进行统计?
- java - 收到错误“类型=不允许的方法,状态=405”
- python - 如何在没有 webdriver 或 twilio 的情况下在 Python 上自动发送 Whatsapp 消息?
- java - 从 github eclipse 克隆后的 java.lang.ClassNotFoundException
- php - 使 PHP url 具有独特的格式