当使用mocha + sinon测试ExpressJS路由时,如何“存根”路由本地的函数?

时间:2016-10-13 18:31:34

标签: node.js unit-testing express mocha sinon

所以在一个文件中,我定义了这条路线:

router.post('/', security.authenticate, function(req, res, next) {
    //Doing prep stuff

    //Do database work (<< this is what im really testing for)

    //Calling another work function.
    createFormUser(req.body, (ret) => {
        return res.json(ret.createdUser);
    });

});

后跟这个功能:

var createFormUser = (ourUser, call) => {
    // does a bunch of misc work and creation for another database
    // unrelated to current tests.
}

我想测试这条路线。通常,我只是创建数据库的沙箱实例,以便它可以做任何想做的事情,在测试中对路由发出http请求,最后在http调用的返回中执行expect()。

但是,我不希望调用“createFormUser”函​​数,因为1)它做了一些花哨的狗屎,这个测试真的很难包含2)我会在其他地方测试它。

在正常的测试中,我会在这一点上使用sinon来保存函数。但在这种情况下,我实际上并没有对象引用,因为这是通过对服务器的HTTP请求完成的,mocha在测试时进行了调整。

所以我的问题与标题相同,如何使用stub / replace / ignore / etc这个方法,以便在测试期间不调用它?

1 个答案:

答案 0 :(得分:0)

如@DavidKnipe所述,我所要做的就是通过以下方式导出方法:

module.exports.createFormUser = (ourUser, call) => { ... }

并且能够单独测试该方法并通过sinon.stub阻止它的执行。