2016-06-29 10 views
3

Es ist der folgende Code von NPM-Modul:JS Verschlüsse mit tiefer Verschachtelung

var actions = {}; 
var methods = ['POST', 'GET', 'PATCH', 'DELETE']; 

methods.forEach(function(method) { 
    actions['mock' + method] = function(browser, url, response) { 
    browser.execute(function() { 
     result[method][url] = response; 
    }); 
    } 
}); 

module.exports = actions; 

I 4 Methoden haben will: mockPOST, mockGET, mockDELETE, mockPATCH. Jede Methode sollte nur browser.execute mit Callback-Funktion ausführen und response in das entsprechende Feld result - result['POST'] in der mockPOST und so weiter. Aber wenn ich ausführen

utils.mockPOST(browser, 'auth', {"result": "OK"}); 

ich method is not defined Fehler. Was soll ich machen? Vielen Dank!

+0

'Ergebnis' ist nicht definiert. – jcubic

+0

Ergebnis ist nicht der Grund, aber browser.execute ist möglicherweise. Wie kann ich es reparieren? Vielen Dank! – malcoauri

Antwort

1

Wie Sie sehen, verwenden Sie Selen oder Webdriver für node.js. Das macht die Dinge ein bisschen knifflig. Sie können keine Verschlüsse in der browser.execute-Funktion verwenden, und der Grund ist, dass es überhaupt nicht ausgeführt wird. Webdriver wird die Funktion in eine Zeichenfolge konvertieren, sie an den Browser übertragen und diese Zeichenfolge innerhalb des Browsers eval. Der Nodejs-Closure wird nicht an den Browser übergeben, nur der Funktionscode als String.

Ich nehme an, das result Objekt ist global innerhalb des Browsers bereits definiert.

Was können Sie dagegen tun? Ich empfehle immer, Funktionsliterale innerhalb browser.execute und browser.executeAsync nicht zu setzen, weil sie verwirrend sind. Sie können stattdessen eine Zeichenfolge eingeben, die ausgewertet wird. Versuchen Sie Folgendes:

methods.forEach(function(method) { 
    actions['mock' + method] = function(browser, url, response) { 
    var browserAction = "result[" + JSON.stringify(method) + "]" + 
     "[" + JSON.stringify(url) + "] = " + 
     JSON.stringify(response) + ";"; 
    browser.execute(browserAction); 
    }; 
}); 
+0

Ihre Antwort ist großartig! Groß! Es klappt. – malcoauri