我有一个非常简单的应用程序,即nodejs,express和mysql 我是单元测试的新手,我认为这个应用程序是一个做得更好的好方法。 我想要完成的(我认为sinon就是答案)是模拟或存根 mysql.insertEventIntoDB 和 rabbit.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;
}
我已经看过许多存根和间谍的例子但是却无法弄清楚如何从这些测试中做到这一点。这是我的一个测试的例子
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();
});
});
感谢任何帮助/指示
答案 0 :(得分:2)
请尝试使用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);
,使用一个回调函数伪造上述函数
var fakeInsertEvt = sinon.stub(mysql, 'insertEventIntoDB', function(){
return Math.random();
});
在您的情况下,似乎第二个选项可能会更好,因为for
中有mysql.insertEventIntoDB
循环。