2016-07-29 23 views
0

我希望能夠定義一個變量,然後在module.run()函數內的respond()方法中使用所述變量。我有這樣的代碼我這()內:在httpBackend模擬函數中使用變量

var testValue=randomValue(); // suffice to say, a random value generator 
    var httpBackendMock = function() { 
     angular.module('httpBackendMock', ['ngMockE2E', 'name.of.app']) 
      .run(function($httpBackend) { 
       $httpBackend.whenPOST(/.*\/api\/data/).respond(function(method, url, data, headers) { 
        return [200, '<?xml version="1.0" encoding="UTF-8" standalone="yes"?> \ 
        <data>'+testValue+'</data>', {}]; 
       }); 
.... 

httpBackendMock對象上面定義的變量testValue是不可見的run()函數裏面所有,但將「未定義」。

我的理解是,'var'定義的變量在JS中可用於內部作用域代碼,但這不會發生在這裏。有沒有辦法讓變量在裏面工作?

+1

'httpBackendMock'是不是一個對象。這是一個功能。請說明發生了什麼。如果使用'browser.executeScript(httpBackendMock)'執行,這顯然不起作用,因爲外部函數作用域在Node中運行,內部函數作用域在瀏覽器中運行。 – estus

+0

@estus它來自https://docs.angularjs.org/api/ngMockE2E/service/$httpBackend。我用ngmocke2e標記了它,因爲我可能需要熟悉該框架的人。 –

+0

在您發佈的鏈接中沒有提及「httpBackendMock」功能。請說明如何調用這個函數。 – estus

回答

0

答案是傳遞一個嵌套的值數組並添加一個參數給mockmodule對象的函數簽名。

var httpBackendMock = function(args) { 
    var isFoo=args[0]; 
    var isBar=args[1]; 
... 
browser.addMockModule('httpBackendMock', httpBackendMock, [['foo','bar']]); 

找到答案於: Protractor addMockModule additional arguments not working?

1

這段代碼

var testValue=randomValue(); 

在節點被執行。而這段代碼

function() { 
    angular.module('httpBackendMock', ['ngMockE2E', 'name.of.app']) 
    ... 
} 

被轉換爲字符串,傳遞給客戶端並在瀏覽器中執行。

外部函數範圍在內部函數可用,這就解釋了爲什麼testValuehttpBackendMock功能undefined,如果httpBackendMock函數使用嚴格的模式下,它會拋出一個錯誤。

其他數據可以通過executeScriptaddMockModule傳遞額外的參數,這些參數將在客戶端提供。

正如in documentation所示,前兩個參數被傳遞給瀏覽器。

它應該是這樣的

var httpBackendMock = function(testValue) { 
    angular.module('httpBackendMock', ['ngMockE2E', 'name.of.app']) 
    ... 
} 
... 
var testValue=randomValue(); 
browser.addMockModule('httpBackendMock', httpBackendMock, testValue);