Как мне сделать запрос базы данных MySQL, используя обещания в транспортире

1

Как я могу запросить базу данных mysql, используя обещания в транспортире?

Я хотел бы выполнять разные запросы несколько раз во время выполнения теста, но моя функция executeSelectQuery выполняется в начале теста, а не в конце. Как я могу преодолеть это, используя обещания?

Мне также нужно получить доступ к объекту внутри executeSelectQuery, и я не могу. Функция возвращает undefined.

Ниже приведен код, как выглядит моя функция 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);
});
Теги:
asynchronous
protractor

2 ответа

0

Сохранять функции запросов в отдельном блоке "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
 });
});
  • 0
    Хм, спасибо, я уже пробовал это, работает, но я не могу получить доступ к возвращенному значению за пределами этого блока.
  • 0
    Объявите переменную результата сверху непосредственно внутри блока описания, вне любого блока 'it'. Он будет действовать как глобальная переменная для блоков 'it' внутри этого блока описания.
Показать ещё 3 комментария
0

Просто executeSelectQuery() функцию 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);
})
  • 0
    Спасибо за вашу помощь, правда! Я уже пробовал подобное решение, оно успешно выполняет запрос, ваше решение также, но это не решает проблему выполнения этих методов. Эти методы выполняются в начале теста, хотя я вызывал их в конце теста. Допустим, мы должны:> ввести имя пользователя> ввести пароль> войти в систему> выполнить запрос (последний метод) Это происходит:> выполнить запрос (вызванный последним внутри тестовой функции)> ввести имя пользователя> ввести пароль> войти
  • 0
    Затем либо используйте browser.wait() в своем запросе, чтобы добавить его в поток управления, либо управляйте выполнением самостоятельно с помощью .then() . enterUserName.then(() => enterPassword.then(() => query...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню