简体   繁体   中英

Using sinon and mocha to test node.js http.get

Let's say I have the following function

'use strict';
var http = require('http');

var getLikes = function(graphId, callback) {
    // request to get the # of likes
    var req = http.get('http://graph.facebook.com/' + graphId, function(response) {
        var str = '';
        // while data is incoming, concatenate it
        response.on('data', function (chunk) {
            str += chunk;
        });
        // data is fully recieved, and now parsable
        response.on('end', function () {
            var likes = JSON.parse(str).likes;
            var data = {
                _id: 'likes',
                value: likes
            };
            callback(null, data);
        });
    }).on('error', function(err) {
        callback(err, null);
    });
};

module.exports = getLikes;

I would like to test it with mocha AND sinon, but I don't get how to stub the http.get .

For now I'm doing a real http.get to facebook, but I would like to avoid it.

Here is my current test:

'use strict';
/*jshint expr: true*/
var should = require('chai').should(),
    getLikes = require('getLikes');

describe('getLikes', function() {

    it('shoud return likes', function(done) {
        getLikes(function(err, likes) {
            should.not.exist(err);
            likes._id.should.equal('likes');
            likes.value.should.exist();
            done();
        });
    });

});

How can I achieve what I want, without relying on something else than sinon? (I don't want to use the request module to perform the get, or using another testing lib)

Thanks!

You should be able to do this with just sinon.stub(http, 'get').yields(fakeStream); but you might be better served by looking at nock and/or rewire . nock would let you fake the facebook response without mucking too much in the getLikes implementation details. rewire would let you swap in a mock http variable into the getLikes scope without monkey patching the http.get function globally.

Do do it with just sinon as above, you'll need to create a mock response that will properly resemble the stream. Something like:

var fakeLikes = {_id: 'likes', value: 'foo'};
var resumer = require('resumer');
var stream = resumer().queue(JSON.stringify(fakeLikes)).end()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM