使用打字稿将 angular 网格列单元格文本与字符串数组进行比较
Compare angular grid column cell texts against a string array using typescript
我是 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();
}
我真的很惊讶你在尝试推送到 ActualRatingsValues
时没有收到错误消息,因为它是 const
.
这里发生的是您的 getText()
调用之后的行实际上在返回所有承诺之前被执行。这就是为什么它似乎不起作用的原因。最简单的选择是实施 async/await。
这是它的样子:(请注意,我还稍微清理了代码)
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);
}
肯定有一些方法可以在不实施 async/await 的情况下实现这一目标。我尝试简单地创建一个示例,然后意识到我的示例不起作用。我建议阅读 Matt 在评论中发布的 question/answer 以便更好地理解。里面有很多有用的信息。
您的代码中有两个问题。
1) ActualRatingsValues.push(text)
应该是 ActualRatingsValues.concat(text)
因为 element.all().getText()
return 最终值是 字符串数组 而不是 字符串 的承诺。
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();
}
我是 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();
}
我真的很惊讶你在尝试推送到 ActualRatingsValues
时没有收到错误消息,因为它是 const
.
这里发生的是您的 getText()
调用之后的行实际上在返回所有承诺之前被执行。这就是为什么它似乎不起作用的原因。最简单的选择是实施 async/await。
这是它的样子:(请注意,我还稍微清理了代码)
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);
}
肯定有一些方法可以在不实施 async/await 的情况下实现这一目标。我尝试简单地创建一个示例,然后意识到我的示例不起作用。我建议阅读 Matt 在评论中发布的 question/answer 以便更好地理解。里面有很多有用的信息。
您的代码中有两个问题。
1) ActualRatingsValues.push(text)
应该是 ActualRatingsValues.concat(text)
因为 element.all().getText()
return 最终值是 字符串数组 而不是 字符串 的承诺。
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();
}