我是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();
}
答案 0 :(得分:1)
您的代码中有两个问题。
1)ActualRatingsValues.push(text)
应该是ActualRatingsValues.concat(text)
因为element.all().getText()
返回的诺言最终值是字符串数组,而不是字符串。
2)wrapper
是一个诺言,您可以在诺言中将值分配给ActualRatingsValues
。
为了消费ActualRatingsValues
,您必须在诺言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();
}
答案 1 :(得分:0)
我真的很惊讶,因为它是ActualRatingsValues
,所以您尝试推送到const
时没有出错。
这里发生的是您的getText()
调用之后的行实际上在返回所有的Promise之前被执行。这就是为什么它似乎不起作用的原因。最简单的选择是实现异步/等待。
这是下面的样子:(请注意,我也整理了一下代码)
async validateRatingsValues() {
const ExpectedRatingsValues: Array<string> = ['A', 'B', 'C', 'D', 'E'];
// this will wait for all the promises to be returned before proceeding
const wrapper = await element.all(by.css('.ag-pinned-left-cols-container div[col-id="name"]'))
.getText()
wrapper.forEach(item => {
expect(ExpectedRatingsValues.indexOf(item)).toBeGreaterThan(-1);
// this should work too
expect(ExpectedRatingsValues).toContain(item);
}
expect(wrapper.length).toEqual(ExpectedRatingsValues.length);
}
肯定有一些方法可以在不实现异步/等待的情况下使它工作。我尝试简要地创建一个示例,然后意识到我的示例无法正常工作。我建议阅读Matt在评论中发布的问题/答案,以更好地理解。那里有很多很好的信息。