代码:
for (var i in RESTCalls_GET) {
describe('Retrieve all Product Component names and their IDs', function() {
var restCalls;
beforeEach(function() {
RESTCalls_GET.setClient(mockClient);
restCalls = new Rest_calls(mockClient);
});
describe(i + '()', function() {
it('should return data if response code is 200', function(done) {
mockClient.mockURLForSucceed(eval('restCalls.' + i + "_RESTCall"), eval('RESTCalls_GET_ExampleData.' + i + "_ExampleData"), 200);
eval('RESTCalls_GET.' + i)(function(result) {
result.should.equal(eval('RESTCalls_GET_ExampleData.' + i + "_ExampleData"));
done();
});
}),
it('should return error if response code is NOT 200', function(done) {
mockClient.mockURLForError(eval('restCalls.' + i + "_RESTCall"), null, TestData.RESTCallResponseError_Test);
eval('RESTCalls_GET.' + i)(function(errorObj) {
errorObj.should.have.property('errorCode');
done();
});
});
});
});
}
我正在循环RESTCalls_GET
中的函数。比方说,i = getComponent
,名为getComponent_RESTCall
的函数将位于模块restCalls
我被告知,实现此目的的一种方法是使用 eval()(即使不推荐)。这种方式不起作用,当我调试时,mockURLForSucceed
中使用eval()的参数是undefined
。
这显然导致我的所有测试失败。
任何建议表示赞赏。
编辑: (其他信息)
var mockClient = function() {
var urlMap = {};
return {
get: function(url, callback) {
var entry = urlMap[url];
if (entry) {
callback(entry[0], entry[1]);
} else {
console.error("Unable to match URL " + url);
}
return {
on: function() {
//Ignore
}
};
},
mockURLForSucceed: function(URLofRESTCall, succeedData, succeedRes) {
urlMap[URLofRESTCall] = [succeedData, {statusCode: succeedRes}];
},
mockURLForError: function(URLofRESTCall, errorData, errorRes) {
urlMap[URLofRESTCall] = [errorData, errorRes];
}
}
}();
编辑: (中途)
我已经使用eval()获取格式 file.functionName 所需的函数/变量名称:
var RESTCallURL = eval('"restCalls." + i + "_RESTCall"');
var RESTCallData = eval('"RESTCalls_GET_ExampleData." + i + "_ExampleData"');
如果这些是字符串,我现在遇到的问题。因此,当我将它们传递给函数时,它获取的是字符串值,而不是它在自己的函数中等于的值,这是否有意义?
我的意思是,如果我现在将RESTCallURL
传递给函数,那么该参数的值将为restCalls.whatever_RESTCall
,而在它获取我调用的REST调用的URL之前({ {1}})。由于我现在有了该函数的名称,我是否能够通过该名称在项目中搜索函数?
这个任务看起来很简单,我想我已经过度思考了。
答案 0 :(得分:0)
我认为你不需要eval
,那么使用
RESTCalls_GET[i](function(result) {
result.should.equal(RESTCalls_GET_ExampleData[i + '_ExampleData']));
done();
});
您可以通过在浏览器控制台中定义以下内容来轻松测试此行为
var test = {
'some-function': function() { console.log('works'); }
};
test['some-function']();