2015-04-21 81 views
1

我們如何確定被調用的變量函數的名稱?在javascript中使用反射來獲取失敗時測試函數的名稱

我有一個函數作爲測試實用程序函數來設置我的測試用例。根據測試傳遞給測試實用程序函數的參數,某些子函數可能執行也可能不執行。有時候這些子功能會失敗,我需要知道哪一個失敗了,但不知道如何去做。在其他語言中,我會在這裏使用反射。這是一個選擇嗎?

下面是一個抽象的例子就是我們正在做的:

exports.test_util_func = function(params, callback){ 
//initialize the functions 
var a = function(callback){ 
    ... 
    //response might be "{status:400, body: {error: {...} } }" 
    callback(error, response); 
} 
var b = function(callback){ 
    ... 
    callback(error, response); 
} 
//determine what functions to run 
var functions_to_run = []; 
if(params.a) functions_to_run.push(a); 
if(params.b) functions_to_run.push(a); 
async.series(functions, function(error, responses){ 
    if(error) throw new Error(error); 
    for(var i in responses){(function(response){ 
    //verify that we received a 200 success status from the server 
    //if we didn't, capture the error 
    if(response.status!==200){ 
     console.log(response.body); 
     console.log(i); 
     //HELP NEEDED HERE - how do we capture better than the function iteration so we know what actually failed? Ideally, we would have: "reflective call() 
     throw new Error(i+": "+JSON.stringify(response.body)); 
    } 
    })(responses[i]);} 
}) 
} 

編輯:可能有東西在這下面的帖子,我們可以使用,但我想一定有更簡單的方法,通過使用__prototype info:Get variable name. javascript "reflection"

回答

0

我發現了一種解決方法,可以讓我繼續使用這種模式,但不完全健壯。創建函數後,我們創建使用存儲函數原型中的名稱。

理想的情況仍然是能夠引用變量的名稱本身。

最終代碼示例:

exports.test_util_func = function(params, callback){ 
//initialize the functions 
var a = function(callback){ 
    ... 
    //response might be "{status:400, body: {error: {...} } }" 
    callback(error, response); 
} 
a.prototype.name = "a"; 
var b = function(callback){ 
    ... 
    callback(error, response); 
} 
a.prototype.name = "b"; 
//determine what functions to run 
var functions_to_run = []; 
if(params.a) functions_to_run.push(a); 
if(params.b) functions_to_run.push(a); 
async.series(functions, function(error, responses){ 
    if(error) throw new Error(error); 
    for(var i in responses){(function(response){ 
    //verify that we received a 200 success status from the server 
    //if we didn't, capture the error 
    if(response.status!==200){ 
     console.log(functions.map(function(func){return func.prototype.name})[i]); 
     console.log(response.body); 
    } 
    })(responses[i]);} 
}) 
} 
相關問題