单元测试:在服务器请求中对功能进行存根/重新连接

问题描述 投票:0回答:1

我想测试进行外部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
1个回答
0
投票

根据模块的导出方式,这里您根本不需要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();
      })
  })
})
© www.soinside.com 2019 - 2024. All rights reserved.