Обратный вызов пользовательской команды nightwatch

Я пытаюсь создать пользовательскую команду в nightwatch, которая выполняет запрос к базе данных Postgres и возвращает результат. Запрос выполняется нормально и выводит результат на консоль, но затем выполнение теста останавливается. Я не понимаю, как работают обратные вызовы. Как я могу исправить эту пользовательскую команду?

exports.command = function(sql, callback) {
  var self = this;
  var pg = require('pg');
  var conString = self.globals.testinfo.connectionString;
  var db = new pg.Client(conString);
  db.connect(function(err) {
    if(err) {
      console.error('could not connect', err);
    } 
    else {
      db.query(sql, function(err, result) {
        if(err) {
          console.log('error running query', err);
        } 
        else {
          console.log(result.rows.length);
          db.end();
        }
      });
    }
  }),
  function(result) {
    if (typeof callback === 'function') {
      callback.call(self, result);
    }
  }  
  return this;
};

2 ответа

Решение

Мне пришлось обернуть соединение с базой данных в команду выполнения, чтобы это работало. Я не уверен, что это лучший способ справиться с обратным вызовом, но он работает. Вот обновленная версия пользовательской команды:

exports.command = function(sql,callback) {
  var self = this;
  var pg = require('pg');
  var cs = self.globals.testinfo.connectionString;
  self.perform(function(self,done) {
    pg.connect(cs,function(err,db,done) {
      if(err) {
        return console.error(err);
      }  
      db.query(sql, function(err,result) {
        done();
        if(err) {
          return console.error(err);
        } 
        console.log(result.rows.length);
        callback(result.rows[0]);
      });
    });
    pg.end();
    done();
  });
};

Вот как я вызываю пользовательскую команду в тесте:

browser.myCustomCommand('select * from table limit 1;', function(row) {
  browser.assert.deepEqual(row.column,'some value');
});

Можете ли вы попробовать это:

exports.command = function(sql, callback) {
   var self = this;
   var pg = require('pg');
   var conString = self.globals.testinfo.connectionString;
   var db = new pg.Client(conString);
   var cb= function(result) {
     if (typeof callback === 'function') {
      callback.call(self, result);
     }
   };
  db.connect(function(err) {
    if(err) {
      console.error('could not connect', err);
       cb(false);
    } 
    else {
      db.query(sql, function(err, result) {
        if(err) {
          console.log('error running query', err);
          cb(false);
        } 
        else {
          console.log(result.rows.length);
          db.end();
          cb(true);
        }
      });
    }
  }), 
  return this;
};

И в вашем тесте:

'test' : function(browser){
   browser.yourCommandName(sql,function(result){
      console.log(result); //if connect is good result would be true and false if fail to connect.
});  
}

Ps: результат в обратном вызове может быть как объект (содержать строки или все, что вы хотите), вместо логического только в этом примере.

А Nightwatch используется для сквозного тестирования, оно не предназначено для тестирования баз данных, я думаю, вы должны найти другую платформу для тестирования соединения с базой данных.

Другие вопросы по тегам