krish krish - 3 months ago 20
Node.js Question

sinon spy as callback not being called

I have my source file for which i have written test cases for

var debug = require('debug')('kc-feed:source:fb');
var request = require('request');
var config = require('../../config').root;


exports.source = function fetchFeed (callback) {
var params = {
headers: {'content-type' : 'application/jsons'},
url: config.host + "v1/social/fb/sync_feed",
method: 'GET'
};

request(params, function(err, body, response) {
if(err) {
callback(err);
}
else {
var raw_data = JSON.parse(response);
callback(null, raw_data);
}
});
};


This is my mocha test case

var chai = require('chai'),
expect = chai.expect,
app = require('../app'),
rewire = require('rewire'),
fbfeed = rewire('../src/feed/source/fb_feed'),
supertest = require('supertest'),
sinon = require('sinon'),
nock = require('nock');

describe('test cases for fb feed file', function() {
var callback;
beforeEach(function(){
callback = sinon.spy();
});

after(function(){
nock.cleanAll();
});

it('callback should be called with the response', function(done) {
nock('http://localhost:3000/')
.get('/v1/social/fb/sync_feed')
.reply(200, {});
callback = sinon.spy();
fbfeed.source(callback);
sinon.assert.calledOnce(callback);
done();
});

it('callback should be called with the error', function(done) {
nock('http://localhost:3000/')
.get('/v1/social/fb/sync_feed')
.replyWithError(new Error('err'));
fbfeed.source(callback);
sinon.assert.calledOnce(callback);
done();
});


Both my test cases fail as it says that callback is called 0 times. But the callback is always called. Please help.

Answer

It looks like the requests are still being performed asynchronously (I can't definitively say if this is expected when using nock), so you can't use spies like that.

Provide a regular callback instead:

fbfeed.source(function(err, raw_data) {
  ...make your assertions...
  done();
});