【发布时间】:2020-01-25 23:43:55
【问题描述】:
我想测试一个进行外部 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:再次更新代码以显示导入方法
【问题讨论】:
标签: javascript node.js unit-testing chai sinon