使用sinon和mocha来testingnode.js http.get

假设我有以下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; 

我想用摩卡和sinon来testing它,但是我不知道如何去http.get

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

这是我目前的testing:

 '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? (我不想使用请求模块执行获取,或使用另一个testing库)

谢谢!

你应该可以用sinon.stub(http, 'get').yields(fakeStream); 但是通过查看nock和/或rewire你可能会更好。 nock会让你伪造Facebook的反应,而不会在getLikes实现细节中getLikes太多。 rewire可以让你在一个模拟httpvariables中交换getLikes范围,而不用全局http.get函数。

如上所述,只要使用sinon就可以了,您需要创build一个模拟响应,使其正确地类似于stream。 就像是:

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