使用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
可以让你在一个模拟http
variables中交换getLikes
范围,而不用全局http.get
函数。
如上所述,只要使用sinon就可以了,您需要创build一个模拟响应,使其正确地类似于stream。 就像是:
var fakeLikes = {_id: 'likes', value: 'foo'}; var resumer = require('resumer'); var stream = resumer().queue(JSON.stringify(fakeLikes)).end()