使用sinon和mocha来测试node.js http.get

时间:2015-01-25 17:11:45

标签: node.js testing mocha sinon

假设我有以下功能

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

我想用mocha AND sinon测试它,但我不知道如何存根http.get

现在我正在为Facebook做一个真正的http.get,但我想避免它。

这是我目前的测试:

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

});

我如何能够实现我想要的东西,而不依赖于除了sinon之外的其他东西? (我不想使用请求模块来执行get,或者使用另一个测试库)

谢谢!

1 个答案:

答案 0 :(得分:0)

您应该只使用sinon.stub(http, 'get').yields(fakeStream);执行此操作,但查看nock和/或rewire可能会更好。 nock会让你伪造facebook的回复,而不会在getLikes实施细节中过多地删掉。 rewire允许您将模拟http变量换入getLikes范围,而无需全局修补http.get函数。

如上所述,只需使用sinon,您需要创建一个类似于流的模拟响应。类似的东西:

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