假设我有以下功能
'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,或者使用另一个测试库)
谢谢!
答案 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()