Javascript 如何将单元测试写入";“请求”;带有sinon.stub的节点模块?
我的代码中有此函数:Javascript 如何将单元测试写入";“请求”;带有sinon.stub的节点模块?,javascript,angularjs,unit-testing,sinon,Javascript,Angularjs,Unit Testing,Sinon,我的代码中有此函数: let request = require("request"); let getDrillDownData = function (userId, query, callback) { query.id = userId; let urlQuery = buildUrlFromQuery(query); request.get({ url: urlQuery, json: true }, function (error, response, data)
let request = require("request");
let getDrillDownData = function (userId, query, callback) {
query.id = userId;
let urlQuery = buildUrlFromQuery(query);
request.get({
url: urlQuery,
json: true
}, function (error, response, data) {
if (!error && response.statusCode === 200) {
return callback(null, calculateExtraData(data));
} else if (error) {
return callback(error, null);
}
});
};
我想写一些单元测试来验证当用正确的参数调用函数时,它运行正常,
如果有错误,它会返回错误
我编写了以下单元测试代码:
describe.only('Server Service Unit Test', function(){
var sinon = require('sinon'),
rewire = require('rewire');
var reportService;
var reportData = require('./reportData.json');
beforeEach(function(){
reportService = rewire('../../services/reports.server.service');
});
describe('report methods', function(){
var reportData;
var query = { id: "test"};
var userId = 'testuser';
var getDrillDownData;
var request;
beforeEach(function(){
getDrillDownData = reportService.__get__('getDrillDownData');
});
it ('should get drill down data by userId and query', function(done){
var getCallback = sinon.stub();
request = {
get: sinon.stub().withArgs({
url: query,
json: true
}, getCallback.withArgs("error", {statusCode: 200}, reportData))
};
reportService.__set__('request', request);
getDrillDownData(userId, query, function(err, returnData){
(err === null).should.eql(true);
//(getCallback.withArgs(undefined, {statusCode: 200}, reportData).calledOnce).equal(true);
done();
});
});
});
但我一直在犯这样的错误:
错误:超过2000毫秒的超时时间。确保在此测试中调用了done()回调
有人能帮忙吗?
谢谢我将存根
请求。get()
直接:
describe('report methods', function() {
// Make `request.get()` a Sinon stub.
beforeEach(function() {
sinon.stub(request, 'get');
});
// Restore the original function.
afterEach(function() {
request.get.restore();
});
it ('should get drill down data by userId and query', function(done) {
// See text.
request.get.yields(null, { statusCode : 200 }, { foo : 'bar' });
// Call your function.
getDrillDownData('userId', {}, function(err, data) {
...your test cases here...
done();
});
});
});
使用request.get.yields()
(它调用Sinon可以在参数列表中找到的第一个函数参数;在本例中,是(错误、响应、数据)
回调传递到函数中的request.get()
)可以告诉Sinon使用哪些参数来调用回调
这样,您就可以检查request.get()
的回调是否正确处理了所有参数
您也可以使用.withArgs()
(request.get.withArgs(…).yields(…)
),尽管您必须确保正确使用它;否则,如果确切参数不匹配,Sinon将调用原始的request.get()
,而不是使用存根版本
相反,我更喜欢在调用后使用
stub.calledWith()
检查正确的参数。这与摩卡的集成也更好,因为您可以使用明确的断言。谢谢!它帮助了我!