2016-10-26 137 views
1

奇怪的問題當我嘗試解決(履行)量角器中的承諾時,我還不明白。解決量角器中的承諾

deferred.fulfill(rowData);錯誤,因爲它不會像我所期望的那樣返回row數據。

換句話說,rowData.count()在較低的功能是好的,但返回時row.count()失敗。

this.gridFunction = function (summaryData){ 
 

 

 
    var rowData = getGridRowByText(gridRows, name, text); 
 
    
 
    rowData.then(function (row) {    
 
    // ** THROWS ERROR ** TypeError: row.count is not a function 
 
    expect(row.count()).toEqual(3); 
 

 
    row.map(function (cell) { 
 
     // iterate cell contents, compare with "summaryData" 
 
    }); 
 

 
    }); 
 
} 
 

 

 
function getGridRowByText(gridRows, grid, text) { 
 
     var deferred = protractor.promise.defer(); 
 
       
 
     var parentId = getParId(); 
 

 
     parentId.getAttribute("id").then(function (parentId) { 
 

 
      // i.e. jquery $('.grid-wrapper.fluid-wrapper #rowId_21') 
 
      var sel = '.grid-wrapper.fluid-wrapper #' + parentId; 
 
      
 
      var rowData = element(by.css(sel)).all(by.repeater('column in vm.sourceData.columns')); 
 
      
 
      // EXPECT SUCCESSFULL !!! 
 
      expect(rowData.count()).toEqual(19); 
 
      
 
      
 
      deferred.fulfill(rowData); 
 
     }); 
 
     return deferred.promise; 
 
};

主要問題:我不能正確地與rowData對象返回兌現承諾?

* UPDATE *

我的最終解決方案:

它實際上並沒有解決我原來用量角器無極工作的問題,而是隻是一個邏輯的重新設計。

this.gridFunction = function (targetRowText){ 
 

 
    
 
    var result = gridRows.all(by.cssContainingText('span', targetRowText)).first(); 
 
    var parentId = result.all(by.xpath("./ancestor::div[starts-with(@id, 'rowId')]")); 
 
     
 
     
 
    parentId.getAttribute("id").then(function (parentId) {    
 
     console.log(' (ROW-ID: ', parentId); 
 
      
 
     // further iterations here... 
 
    } 
 
    
 
}

謝謝你, 鮑勃

回答

1

你實際上並不需要一個 「延遲」 反對在這裏。剛剛從函數返回的承諾:

function getGridRowByText(gridRows, grid, text) { 
    var parentId = getParId(); 

    return parentId.getAttribute("id").then(function (parentId) { 
     var sel = '.grid-wrapper.fluid-wrapper #' + parentId; 
     return element(by.css(sel)).all(by.repeater('column in vm.sourceData.columns')); 
    }); 
}; 

用法:

var rowData = getGridRowByText(gridRows, name, text); 
expect(rowData.count()).toEqual(3); 

或者,如果需要在getgridRowByText()功能進一步處理:

function getGridRowByText(gridRows, grid, text) { 
    var parentId = getParId(); 

    return parentId.getAttribute("id").then(function (parentId) { 
     var sel = '.grid-wrapper.fluid-wrapper #' + parentId; 

     var rowData = element(by.css(sel)).all(by.repeater('column in vm.sourceData.columns')); 

     // further processing here 
     expect(rowData.count()).toEqual(19); 

     return rowData; 
    }); 
}; 
+0

我確實有進一步加工成做。我將「rowData」單元格的內容與我以前填充的一些「summaryData」對象進行比較。這就是爲什麼我設定了承諾。主要問題是:爲什麼履行行爲不如預期? 'rowData'似乎已經改變。 –

+0

@ bob.mazzo gotcha,我認爲目前的問題是你正在製作一個「延遲」,它沒有'count()'方法作爲'ElementArrayFinder'。我仍然認爲你不需要手動作出承諾並實現它,我已經添加了另一個示例代碼來演示你仍然可以從函數中返回'rowData'(注意上層的'return' )。謝謝。 – alecxe

+0

是的,事實上,我今天早些時候最終拋棄了額外的函數調用。它太笨拙了。我會在早上檢查你的附加解決方案。非常感謝,亞歷克。 –