使用nodejs,mocha,chai和sinon我想要一个在路由

时间:2016-03-08 23:53:33

标签: node.js mocha sinon chai

我有一个非常简单的应用程序,即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();
  });
 });

感谢任何帮助/指示

1 个答案:

答案 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循环。