2016-03-08 82 views
1

我有一个非常简单的应用程序,它是nodejs,express和mysql 我是单元测试新手,我认为这个应用程序是一个更好的方法。 什么,我试图完成(我认为兴农是答案)是嘲笑或存根mysql.insertEventIntoDB和我的应用程序rabbit.addToRabbitMQ使用nodejs,mocha,chai和sinon我想存根在路由中调用的函数

我有

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; 
} 

我已经看到了很多例子存根和spys的,但只是无法弄清楚如何从这些测试做。这是我的测试中的一个例子

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(); 
    }); 
}); 

感谢您的帮助/方向

回答

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

相关问题