2016-01-26 46 views
2

這裏actualLevels陣列拋出空數組中的預期line.I需要actualLevels,且能夠返回斷言只有AFTR陣列完全填充轉換元素的數組承諾並返回它

代碼:

var expected = ['Level 2', 'Level 3', 'Level 4']; 
var actualLevels=[]; 

element.all(by.css('somecssid')).each(function(elm) { 
    elm.getText().then(function (textValue) { 
     console.log(textValue); // prints texts of the css i.e.Level1 
     actualLevels.push(textValue); 
    }) 
} 
expect(actualLevels).toBe(expected); // jasmine expect assertion 
+0

您使用的是量角器嗎? – epascarello

+0

是的,我使用量角器。 – divya

回答

0

因爲你getText功能是異步的,你上線10 expect事情之前被推入textValue被調用。

此外,插入textValue的順序不能保證是相同的,因爲每個調用都是異步的。你可能會得到類似['Level 4', 'Level 2', 'Level 3']的東西。要解決這個問題,你需要使用類似Promise.map的東西。你可以這樣做

Promise.map(arrayOfThings, function(elm) { return elm.getText(); }).then(function(actualLevels){ expect(actualLevels).toBe(expected); });

理想情況下,你會使用可選的回調參數從您的測試框架來測試該代碼。

0

在茉莉花情況下不能確定,但​​一般而言,您正在尋找的模式是

Promise.all(element.map(actualLevel)) . 
    then(actualLevels => console.log(actualLevels)); 
1

可以呼籲ElementFinderArray直接getText()

expect(element.all(by.css('somecssid')).getText()).toEqual(expected); 

注意,沒有需要手動解決承諾,在量角器expect()被修補以隱式理解和解決承諾。

注2:toBe將檢查兩個變量是否指向相同的確切對象 - 您需要toEqual


僅供參考,each()是不是一個好的選擇,map()會更合適:

var expected = ['Level 2', 'Level 3', 'Level 4']; 
var actualLevels = element.all(by.css('somecssid')).map(function(elm) { 
    return elm.getText(); 
}); 
expect(actualLevels).toEqual(expected); // jasmine expect assertion 

如果要另外登錄控制檯上的文字逐一解決getText()

var actualLevels = element.all(by.css('somecssid')).map(function(elm) { 
    return elm.getText().then(function (text) { 
     console.log(text); 
     return text; 
    }); 
}); 

僅供參考2:您可以用快捷方式替換element.all(by.css('somecssid'))

$$('somecssid') 
+0

工作完美! thnaks – divya

+0

爲什麼在返回之前記錄語句elm.getText();打印量角器obj信息而不是文本? – divya

+0

@divya好吧,更新了答案,也請參閱http://stackoverflow.com/help/someone-answers。 – alecxe