我是TypeScript的新手,希望从ag-grid列中抓取值列表并将其与字符串数组进行比较。这是我为实现此目的而编写的功能。但我的ActualRatingsValues.push(text);似乎没有填充数组ActualRatingsValues。我不太了解诺言如何运作。这与诺言有关吗?
validateRatingsValues() {
const ExpectedRatingsValues: Array<string> = ['A', 'B', 'C', 'D', 'E'];
const ActualRatingsValues: Array<string> = [];
const wrapper = element.all(by.css('.ag-pinned-left-cols-container div[col-id="name"]'))
.getText()
.then(text => {
ActualRatingsValues.push(text);
});
let match = true;
if (ExpectedRatingsValues != null && ActualRatingsValues != null) {
if (ExpectedRatingsValues.length !== ActualRatingsValues.length) {
match = false;
} else {
for (let i = 0; i < ActualRatingsValues.length; i++) {
if (ActualRatingsValues[i].toString !==
ExpectedRatingsValues[i].toString) {
match = false;
break;
}
}
}
} else {
match = false;
}
expect(match).toBeTruthy();
}
最佳答案
您的代码中有两个问题。
1)ActualRatingsValues.push(text)
应该是ActualRatingsValues.concat(text)
因为element.all().getText()
返回一个promise,其最终值是一个字符串数组,而不是一个字符串。
2)wrapper
是一个承诺,您可以在一个承诺中为ActualRatingsValues
分配值。
为了使用ActualRatingsValues
,您必须在promise then()
内部使用它
validateRatingsValues() {
const ExpectedRatingsValues: Array<string> = ['A', 'B', 'C', 'D', 'E'];
const wrapper = element.all(by.css('.ag-pinned-left-cols-container div[col-id="name"]'))
.getText();
let match = wrapper.then(function(ActualRatingsValues) {
let length = ExpectedRatingsValues.length;
for(let i=0;i<length;i++) {
let find = ActualRatingsValues.includes(ExpectedRatingsValues[i]);
if (find === false) {
return find;
}
}
return true;
});
// match is also a promise which eventual value is a boolean
// why below expect doesn't consume match inside then()
// because Jasmine can detect match is a promise and do the assertion
// inside then() in its implement internally.
expect(match).toBeTruthy();
}