使用打字稿将角度网格列单元格文本与字符串数组进行比较

时间:2018-08-23 15:20:52

标签: javascript typescript protractor angular-promise

我是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();
}

2 个答案:

答案 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在评论中发布的问题/答案,以更好地理解。那里有很多很好的信息。