2016-06-29 3 views
3

:mockPOST、mockGET、mockDELETE、mockPATCH:私は4つのメソッドを持つようにしたいJS閉鎖NPMモジュールの次のコードがあり

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; 

が。各メソッドは、コールバック関数を持つbrowser.executeを実行し、適切なresultフィールドにresponseを入れてください。result['POST']mockPOSTに入れてください。しかし私が実行するとき

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

私はmethod is not definedエラーを取得します。私は何をすべきか?ありがとう!

+0

'result'が定義されていません。 – jcubic

+0

結果が理由ではありませんが、browser.executeが原因である可能性があります。どうすれば修正できますか?ありがとう! – malcoauri

答えて

1

node.js用にセレンまたはwebdriverを使用しています。それは物事をちょっとしたものにしてくれる。 browser.execute関数でクロージャを使用することはできません。なぜなら、クロージャはまったく実行されないからです。 Webdriverは関数を文字列に変換し、それをブラウザに転送し、evalその文字列をブラウザ内に挿入します。 nodejsクロージャーはブラウザーには転送されず、関数コードのみがストリングとして転送されます。

すでにresultオブジェクトがブラウザ内でグローバルに定義されていると仮定します。

あなたはそれについて何ができますか? browser.executebrowser.executeAsyncの中に関数リテラルを混同しないようにすることを常に勧めます。代わりに文字列を置くことができます。これが評価されます。以下を試してください:

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

あなたの答えは最高です!すばらしいです!できます。 – malcoauri