你如何使用SinonJS进行回调方法?

时间:2017-10-25 04:54:13

标签: javascript node.js unit-testing sinon chai

所以我想测试这个方法:

app.get('/test', exposeDb, function(req, res) {
    req.dbService.getUserByID( function(err, result) {
        if (result == 5) {
            res.statusCode = 200;
        }
        else {
            res.statusCode = 500;            
        }
    });
});

我正在尝试将其存根,以便getUserByID方法返回一个值,所以我这样做:

describe('Test', function() {
    beforeEach(function() {
        var getUserByIDStubE = sinon.stub(dbService, 'getUserByID').callsFake(() => {
            return 5;
        });
      });

    it('TESTSETSTETS', function(done) {        
        chai.request(server)
            .get('/test')
            .send({})
            .end(function (err, res) {
                res.should.have.status(200);
            });
            done();
    });
});

问题是,req.dbService.getUserByID中的代码永远不会被调用,因此我无法检查“result”是否等于5的逻辑。

如果我是console.log(req.dbService.getUserByID()),那确实会返回存根值5.但我不知道它在回调时是如何工作的。

如何制作它以便在我的示例中返回5(然后检查res.statusCode)?

提前致谢!

2 个答案:

答案 0 :(得分:2)

看起来你的功能是获得一个回调并用结果调用它,而不是将结果作为你的存根返回。

试试这样:

sinon.stub(dbService, 'getUserByID').callsFake(cb => {
  cb(undefined, 5);
});

答案 1 :(得分:1)

您不需要callsFake()来获取getUserByID tocall回调,以便您可以测试res.statusCode是否设置正确。你想要的sinon函数是stub.yields(),它专门用于此目的,并将使用你提供的参数调用传递给函数的第一个回调函数。

var getUserByIDStubE = sinon.stub(dbService, 'getUserByID').yields([null, 5]);

这将导致您传递给getUserByID的回调被调用,没有错误,值为5或您想要测试的任何值。