【问题标题】:How do I query mysql database by using promises in protractor如何在量角器中使用 Promise 查询 mysql 数据库
【发布时间】:2017-11-02 17:13:44
【问题描述】:

如何在量角器中使用promise查询mysql数据库?

我想在测试执行期间多次执行不同的查询,但我的 executeSelectQuery 函数在测试开始时执行,而不是在测试结束时执行。如何通过使用 Promise 来克服这个问题?

我还需要访问 executeSelectQuery 中的对象,但我无法访问。函数返回未定义。

下面的代码是我的 executeSelectQuery 函数的样子:

function executeSelectQuery(sql){
connectDatabase.connection.query(sql, function(err, data) {
    var result;
    if (err) {
        throw new Error('[ FAIL ] - Unsuccessful query execution!!!');
    }
    else{
        result = data[0].user;
        log.info('[ SUCCESS ] - Query executed successfully: ' + sql + ' with the following result ==> ' + result);
        return result;
    }
  });

}

这是我的测试的样子:

it('Should navigate to webpage..', function(){
    log.info("Test is being executed..");
    login.goTo(parameters.url);
    login.login(parameters.username, parameters.password);
    helper.executeSelectQuery(query_select);
});

【问题讨论】:

    标签: javascript node.js asynchronous protractor


    【解决方案1】:

    只需让您的 executeSelectQuery() 函数返回一个使用数据解析的承诺。

    executeSelectQuery = (sql) => {
        return new Promise((resolve, reject) => {
            connectDatabase.connection.query(sql, (err, data) => {
                if(err) {
                    reject(err);
                }
                resolve(data);
            });
        });
    }
    

    然后在你的测试中解决它

    executeSelectQuery().then((data) => {
        console.log(data);
    })
    

    【讨论】:

    • 感谢您的帮助,真的!我已经尝试过类似的解决方案,它成功执行查询,您的解决方案也是,但它没有解决执行这些方法的问题。这些方法在测试开始时执行,即使我在测试结束时调用它们。假设我们必须:>输入用户名>输入密码>登录>执行查询(最后一个方法)发生这种情况:>执行查询(在测试函数中调用最后一个)>输入用户名>输入密码>登录
    • 然后在查询中使用browser.wait() 将其添加到控制流中,或者使用.then() 自行控制执行。 enterUserName.then(() => enterPassword.then(() => query...
    【解决方案2】:

    在最后一个单独的“it”块中调用查询函数

    describe('Overall Test Suite',function() {
     var expectedResult; //global variable for all 'it' blocks inside suite.
     it('Should navigate to webpage..', function(){
        log.info("Test is being executed..");
        login.goTo(parameters.url);
        login.login(parameters.username, parameters.password);
      });
    
    it('Executing Queries', function(){
        expect(helper.executeSelectQuery(query_select)).toBeEqual(expectedResult);//let jasmine resolve the promise implicitly
     });
    });
    

    【讨论】:

    • 嗯,谢谢,我已经尝试过了,可以,但是我无法访问它块之外的返回值。
    • 直接在 describe 块内部、任何 'it' 块外部声明结果变量。它将充当该 describe 块内的 'it' 块的全局变量。
    • 那么也不需要返回结果变量,给它赋值即可。
    • 如果我们把它放在'it'块之外,打印出未定义的ofc,这不是解决这个问题的方法。
    • 我用代码更新了我的答案,让你有一个更清晰的想法。
    猜你喜欢
    • 1970-01-01
    • 2015-03-09
    • 2015-06-14
    • 1970-01-01
    • 2019-04-22
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 2018-02-01
    相关资源
    最近更新 更多