Javascript 如何在量角器中使用Promissions查询mysql数据库

Javascript 如何在量角器中使用Promissions查询mysql数据库,javascript,node.js,asynchronous,protractor,Javascript,Node.js,Asynchronous,Protractor,如何在量角器中使用Promissions查询mysql数据库 我希望在测试执行期间多次执行不同的查询,但我的executeSelectQuery函数在测试开始时执行,而不是在测试结束时执行。我如何通过承诺来克服这一点 我还需要访问executeSelectQuery中的对象,但我无法访问。函数返回未定义的 下面的代码是我的executeSelectQuery函数的外观: function executeSelectQuery(sql){ connectDatabase.connection.qu

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

我希望在测试执行期间多次执行不同的查询,但我的executeSelectQuery函数在测试开始时执行,而不是在测试结束时执行。我如何通过承诺来克服这一点

我还需要访问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);
});
}

我的测试是这样的:

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);
});

只需让您的
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);
})

只需让您的
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);
})

将查询函数调用保留在最后一个中单独的“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
 });
});

将查询函数调用保留在最后一个中单独的“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
 });
});

谢谢你的帮助,真的!我已经尝试过类似的解决方案,它成功地执行了查询,您的解决方案也是,但它没有解决执行这些方法的问题。这些方法在测试开始时执行,即使我在测试结束时调用了它们。假设我们必须:>输入用户名>输入密码>登录>执行查询(最后一种方法)这种情况发生:>执行查询(称为最后一种内部测试函数)>输入用户名>输入密码>登录,使用
浏览器。在查询上等待()
将其添加到控制流中,或使用
自己控制执行。然后()
<代码>输入用户名。然后(()=>输入密码。然后()=>查询…谢谢您的帮助,真的!我已经尝试过类似的解决方案,它成功地执行了查询,您的解决方案也是如此,但它没有解决执行这些方法的问题。这些方法在测试开始时执行,即使我在测试结束时调用了它们。假设我们必须:>输入用户名>输入pas剑>登录>执行查询(最后一种方法)这种情况发生:>执行查询(调用最后一个内部测试函数)>输入用户名>输入密码>登录,使用
浏览器。在查询上等待()
将其添加到控制流中,或使用
。然后()
输入用户名。然后(()=>输入密码。然后(()=>查询…
Hmm谢谢,我已经尝试过了,但我无法访问it块外的返回值。直接在Descripte块内、任何“it”块外的顶部声明结果变量。它将充当该Descripte块内“it”块的全局变量。然后也不需要返回结果变量。只需分配v它的值。如果我们把它放在“it”块之外,打印出未定义的ofc,这不是解决这个问题的方法。我用代码更新了我的答案,给你一个更清晰的想法。嗯,谢谢,我已经尝试过了,但我无法访问它块之外的返回值。直接在描述b中声明顶部的结果变量锁,在任何“it”块外。它将作为描述块内“it”块的全局变量。然后也不需要返回结果变量。只需将值赋给它。如果我们将其放在“it”块外,则打印出未定义的ofc,这不是解决此问题的方法。我用代码更新了我的答案,为您提供了更多的c李尔王的主意。