Protractor 量角器-在执行expect之前,等待异步调用完成

Protractor 量角器-在执行expect之前,等待异步调用完成,protractor,Protractor,我正在运行以下程序: it('should be able to run sql', function () { var success = true; var testsCompleted; for (var i = 0; i < sqlToRun[1].length; i++) { sql.runEtlQuery(config, sqlToRun, i).then(function () { testsCompleted+

我正在运行以下程序:

it('should be able to run sql', function () {
    var success = true;
    var testsCompleted;
    for (var i = 0; i < sqlToRun[1].length; i++) {
        sql.runEtlQuery(config, sqlToRun, i).then(function () {
            testsCompleted++;
        }).catch(function (err) {
            console.log(err);
            success = false;
        });
    }
    expect(testsCompleted == sqlToRun[1].length).toBeTruthy();
    expect(success).toBeTruthy();
});
控制台输出如下所示:

[13:12:42] I/launcher - Running 1 instances of WebDriver
[13:12:42] I/local - Starting selenium standalone server...
[13:12:43] I/local - Selenium standalone server started at http://10.197.244.125:62251/wd/hub
Started
..F

Failures:
1) ETL tests should be able to run sql
  Message:
    Expected false to be truthy.
  Stack:
    Error: Failed expectation
---<removed stacktrace>---

3 specs, 1 failure
Finished in 270.903 seconds

#17: CDW_Test - Passed
#15: CDW_LabTestName - Passed
#4: CDW_removed - Passed
#5: CDW_removed - Passed
#1: CDW_moreremoved - Passed
#30: CDW_Stuff - Passed
<ect>
[13:12:42]I/launcher-运行WebDriver的1个实例
[13:12:42]I/local-正在启动selenium独立服务器。。。
[13:12:43]I/local-Selenium独立服务器已在启动http://10.197.244.125:62251/wd/hub
起动
F
失败:
1) ETL测试应该能够运行sql
信息:
期望虚假成为真实。
堆栈:
错误:预期失败
------
3个规格,1个故障
以270.903秒完成
#17:CDW_测试-通过
#15:CDW_LabTestName-已通过
#4:CDW_已移除-通过
#5:CDW_已移除-通过
#1:CDW_More已删除-通过
#30:CDW_材料-通过
我试图弄清楚如何让它在检查测试是否失败或通过之前等待所有sql查询完成


我曾经使用过它,这样它在第一个错误时就会失败,但我想更改它,以便它在测试失败之前继续处理sql查询,以获得所有失败的列表。

首先,这是一个很好的例子,说明为什么我不喜欢测试中出现多个
expect
。。。因为我不知道你的
expect
s中哪个失败了

也就是说,假设失败的不是您
runEtlQuery
方法,那么您可能会遇到问题

TLDR;可以使用来确保索引按预期绑定

it('should be able to run sql', function () {
    var success = true;
    var testsCompleted;
    for (var i = 0; i < sqlToRun[1].length; i++) {
        (funciton(index) {
            sql.runEtlQuery(config, sqlToRun, index).then(function () {
                testsCompleted++;
            }).catch(function (err) {
                console.log(err);
                success = false;
            });
        })(i);
    }
    expect(testsCompleted == sqlToRun[1].length).toBeTruthy();
    expect(success).toBeTruthy();
});
it('应该能够运行sql',函数(){
var成功=真;
var测试完成;
对于(var i=0;i
我确实找到了让它正常工作的方法,即使它不是最优雅的解决方案:

it('should be able to run sql', function (done) {
    sql.recursiveRunEtlQuery(config, sqlToRun, sqlToRun[1].length - 1).then(function () {
        done();
    }).catch(function (err) {
        success = false;
        done.fail(err);
    });
然后RecursiveUnetlQuery函数如下所示:

runEtlQuery: function (config, sqlToRun, i) {
    var defer = protractor.promise.defer();
    var connection = new sql.ConnectionPool(config, function (err) {
        var request = new sql.Request(connection);
        request.query(sqlToRun[1][i], function (err, recordset) {
            if (err) defer.reject("#" + i + ": " + sqlToRun[0][i] +"\x1b[31m Error: \x1b[0m" + err);
            else {
                console.log("#" + i + ": " + sqlToRun[0][i] + " - \x1b[32mPassed\x1b[0m");
                defer.fulfill();
                connection.close();
            }
        });
    });
    return defer.promise;
},
recursiveRunEtlQuery: function (config, sqlToRun, i) {
    var defer = protractor.promise.defer();
    if (i >= 0) {
        module.exports.recursiveRunEtlQuery(config, sqlToRun, i - 1).then(function () {
            module.exports.runEtlQuery(config, sqlToRun, i).then(function () {
                defer.fulfill();
            }).catch(err => {
                defer.reject(utilities.stringFormat("Error Running ETL: \x1b[36m{0}\x1b[0m:\nSQL:\n\x1b[33m{1}\x1b[0m\nError:\n\x1b[31m{2}\x1b[0m", sqlToRun[0][i], sqlToRun[1][i], err));
            });
        }).catch(err => {
            module.exports.runEtlQuery(config, sqlToRun, i).then(function () {
                defer.reject(err);
            }).catch(err2 => {
                defer.reject(utilities.stringFormat("Error Running ETL: \x1b[36m{0}\x1b[0m:\nSQL:\n\x1b[33m{1}\x1b[0m\nError:\n\x1b[31m{2}\x1b[0m\n{3}", sqlToRun[0][i], sqlToRun[1][i], err2, err));
            });
        });
    }
    else defer.fulfill();
    return defer.promise;

此解决方案的主要问题是,它强制它同步运行,而不是异步运行,这将导致它运行更长时间,因为某些查询需要一段时间才能完成。

是的,我通常会注释掉其中一个“expect”,而
testsCompleted
行基本上只用于调试代码以确保在运行预期之前完成所有工作。不管是否有sql错误,只要有
success
行,测试总是会成功的。我只是试着在中运行它,当它应该成功时它仍然失败,当它应该失败时它仍然成功(即第一个expect将导致它失败,第二个expect将导致它成功,即使有错误),因此,在完成第一个sql之前,它仍在运行expect。