在另一个模块中具有类似功能名称的模块中的访问功能

时间:2015-12-18 10:34:31

标签: javascript node.js

代码:

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}})。由于我现在有了该函数的名称,我是否能够通过该名称在项目中搜索函数?

这个任务看起来很简单,我想我已经过度思考了。

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']();