首页 > 解决方案 > 单元测试:存根/重新连接服务器请求中的函数

问题描述

我想测试一个进行外部 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:再次更新代码以显示导入方法

标签: javascriptnode.jsunit-testingchaisinon

解决方案


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

推荐阅读