我需要测试一个方法,该方法包含一个调用API服务器的子方法。我想研究这个内部子方法,但我似乎无法做到这一点。这是一个例子:
var requests = require('./requests.js');
var utilityClass = {
methodCreatesObject: function (callback) {
// Here’s the method I’m trying to stub:
requests.makeCallToAPI(requestObject, function (err, responseFromAPI) {
doSomethingWithResponse(responseFromAPI, function (err, finalObject) {
if (err) {
callback(err, null);
} else {
callback(null, finalObject); // <- Want to test the value of finalObject
}
});
});
}
}
所以,我的测试看起来像这样(更新后显示在requests.js
之前加载utility.js
):
var should = require('should'),
Joi = require('joi'),
sinon = require('sinon'),
requests = require('../lib/modules/requests.js'),
utility = require('../lib/modules/utility.js')
;
// Start my tests:
describe('Method', function () {
before(function () {
var fakeAPIresponse = { ... }
sinon.stub(requests, 'makeCallToAPI').yield(null, fakeAPIresponse);
});
it('should produce a well-formed finalObject', function (done) {
utilityClass.methodCreatesObject(function (err, response) {
if (err) {
done(err);
} else {
response.should.do.this.or.that;
done();
}
});
});
});
据我了解,.yields()
应该尝试运行它在参数中检测到的第一个回调,并将自己的参数提供给它(产生doSomethingWithResponse(responseFromAPI, function () {...})
)。但是,在运行mocha时,我收到一条错误,表明无法访问API服务器,这表示正在调用真实的requests.makeCallToAPI()
,而不是我的存根。
我一定错过了什么。我在这里做错了什么?
答案 0 :(得分:1)
您要求request.js
在哪里?在加载要测试的模块之前,您需要要求request.js.
编辑1:使用sinon.js
以下是我的意思:https://gist.github.com/limianwang/1114249de99c6a189384
编辑2:使用proxyquire
如果您打算简单地测试utilities
而不关心requests.makeAPICall
中实际发生的事情,您可以使用类似proxyquire
的方法来执行此操作。如果您关注requests.js
中的实际逻辑,可以使用sinon.stub来删除实际的request.get
api。