samedi 4 juillet 2015

Mock 'end' signal from emitter, but it doesn't get called

I am doing a unit testing with mocha + unit.js + proxyquire.
Right now I am stuck at mocked emitter. First mocked emitter which is a fake on 'row' signal, it done. Second one I followed the same like first one. Since it is not a big difference, but I at here I have a question.

Why emitter is not emit 'end'?

userHandler_post.js :


var httpMocks = require('node-mocks-http');
var test = require('unit.js');

var real_userHandler = require('../routes/userHandler_post.js');

var proxyquire =  require('proxyquire'),
        pgStub   =  { };

var events = require('events');


describe('userHandler_post : ', function () {

    var request;
    beforeEach(function (){
            request  = httpMocks.createRequest({
          method: 'POST',
          url: '/users',
          body : { Username : 'Yoda', 
                                ... //Omit to save question lines.
                                FaxNum: '',
                            }
    });
    });

    it('should show connetion error. If cannot connect to database.', function (done) {

        pgStub.connect = function (aconnectionString, cb){
            cb('Connection refused',null,null); 
        };

    var response = httpMocks.createResponse();

    var userHandler_post = proxyquire('../routes/userHandler_post.js', { 'pg' : pgStub} );

    userHandler_post.post(request,response);    //Let it update response
        var answer = response._getData();
        test.value(answer).match('Connection refused');

        done(); //Need
    });

    it('should show query error. If database rejects query.', function (done) {

        pgStub.connect = function (aconnectionString, cb){
            var client = {};
            client.query = function(querystr){
                var emitter = new events.EventEmitter();

                setTimeout(function() {
                    emitter.emit('error', {detail: 'Query error'})
                }, 0);      

                return emitter; //return to addUser_ in userHandler_post.js
            };

            var done = function(){};
            cb(null,client,done);

        };

        var response = httpMocks.createResponse();

    var userHandler_post = proxyquire('../routes/userHandler_post.js', { 'pg' : pgStub} );

    userHandler_post.post(request, response, function(){
            var answer = response._getData();
            test.value(answer).match('Query error');
    });

        done(); //Need
    });

    it('should show several records. If database processes query.', function (done) {

        pgStub.connect = function (aconnectionString, cb){
            var client = {};
            client.query = function(querystr){

                var emitter = new events.EventEmitter();
                console.log('below emitter');

                setTimeout(function() {
                    console.log('-*************--');
                    emitter.emit('end', {a : 1});
                }, 0);      //

                return emitter; //return to addUser_ in userHandler_post.js

            };

            var done = function(){};    //Because in real life we have done().
            cb(null, client, done);

        };

        var response = httpMocks.createResponse();

    var userHandler_post = proxyquire('../routes/userHandler_post.js', { 'pg' : pgStub} );
        userHandler_post.post(request, response, function(){
            var answer = response._getData();
            console.log(answer);    //Not assert yet since it has no output.
    });

        done(); //Need
    });

});



userHandler_post.test.js :

var httpMocks = require('node-mocks-http');
var test = require('unit.js');

var real_userHandler = require('../routes/userHandler_post.js');

var proxyquire =  require('proxyquire'),
        pgStub   =  { };

var events = require('events');


describe('userHandler_post : ', function () {

    var request;
    beforeEach(function (){
            request  = httpMocks.createRequest({
          method: 'POST',
          url: '/users',
          body : { Username : 'Yoda', 
                                ... //Omit to save question lines.
                                FaxNum: '',
                            }
    });
    });

    it('should show connetion error. If cannot connect to database.', function (done) {

        pgStub.connect = function (aconnectionString, cb){
            cb('Connection refused',null,null); 
        };

    var response = httpMocks.createResponse();

    var userHandler_post = proxyquire('../routes/userHandler_post.js', { 'pg' : pgStub} );

    userHandler_post.post(request,response);    //Let it update response
        var answer = response._getData();
        test.value(answer).match('Connection refused');

        done(); //Need
    });

    it('should show query error. If database rejects query.', function (done) {

        pgStub.connect = function (aconnectionString, cb){
            var client = {};
            client.query = function(querystr){
                var emitter = new events.EventEmitter();

                setTimeout(function() {
                    emitter.emit('error', {detail: 'Query error'})
                }, 0);      

                return emitter; 
            };

            var done = function(){};    
            cb(null,client,done);

        };

        var response = httpMocks.createResponse();

    var userHandler_post = proxyquire('../routes/userHandler_post.js', { 'pg' : pgStub} );

    userHandler_post.post(request, response, function(){
            var answer = response._getData();
            test.value(answer).match('Query error');
    });

        done(); //Need
    });

    it('should show several records. If database processes query.', function (done) {

        pgStub.connect = function (aconnectionString, cb){
            var client = {};
            client.query = function(querystr){

                var emitter = new events.EventEmitter();
                console.log('below emitter');

                setTimeout(function() {
                    console.log('-*************--');
                    emitter.emit('end', {a : 1});   
                }, 0);      //

                return emitter; 
            };

            var done = function(){};
            cb(null, client, done);

        };

        var response = httpMocks.createResponse();

    var userHandler_post = proxyquire('../routes/userHandler_post.js', { 'pg' : pgStub} );

        userHandler_post.post(request, response, function(){
            var answer = response._getData();
            console.log(answer);
//          test.value(answer).match('Connection refused');
    });

//      console.log(response._getData());
        done(); //Need
    });

});


Terminal :

mocha testing/userHandler_post.test.js


  userHandler_post : 
    ✓ should show connetion error. If cannot connect to database.
    ✓ should show query error. If database rejects query.
below emitter
    ✓ should show several records. If database processes query.


  3 passing (10ms)


If it really emitted the 'end' signal. Then it should say 'Insert record completed'.

Any help would be appreciated
Sarit

Aucun commentaire:

Enregistrer un commentaire