使用nodejs,mocha,chai和sinon我想存根在路由中调用的函数

我有一个非常简单的应用程序,它是nodejs,express和mysql我是新的unit testing,我认为这个应用程序是一个很好的方法来做得更好。 我试图完成(我认为sinon是答案)是模拟或存根mysql.insertEventIntoDBrabbit.addToRabbitMQ

在我的应用程序中,我有

app.use('/sendgrid', sendgrid(pool, config, logger) ); 

在我的sendgrid.js中

 var express = require('express'); var mysql = require('../app/utils/mysql'); var rabbit = require('../app/utils/rabbitMQ'); module.exports = function (dbpool, config, logger) { var router = express.Router(); router.post('/callback', function (req, res) { for (var x=0 ; x < req.body.length ; x++ ){ mysql.insertEventIntoDB(dbpool, req.body[x], logger); rabbit.addToRabbitMQ(config,req.body[x], logger) } res.json({ status: 'OK' }); }); return router; } 

我已经看到很多存根和间谍的例子,但只是不知道如何从这些testing中做到这一点。 这是我的一个testing的例子

 it('should get an OK for delivered POST', function(done) { chai.request(server) .post('/sendgrid/callback') .send(delivered) .end(function(err, res){ res.should.have.status(200); res.should.be.json; res.body.should.be.a('object'); res.body.should.have.property('status'); res.body.status.should.equal('OK'); done(); }); }); 

感谢任何帮助/方向

请尝试使用sinon.stub

 var stub = sinon.stub(object, "method"); 

伪造mysql.insertEventIntoDB

 var fakeInsertEvt = sinon.stub(mysql, 'insertEventIntoDB'); 

然后在调用这个伪造函数时定义它的行为, onCall的参数就是这个函数被调用的编号。

 fakeInsertEvt.onCall(0).return(0); 

或者根据var stub = sinon.stub(object, "method", func); 用一个callback函数来伪造上述函数

 var fakeInsertEvt = sinon.stub(mysql, 'insertEventIntoDB', function(){ return Math.random(); }); 

在你的情况,似乎第二个选项可能会更好,因为有循环出mysql.insertEventIntoDB