2016-05-17 38 views
2

我正在尝试在运行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'); 
}); 
+0

你如何使用这个browser.assert.deepEqual函数。 Nightwatch API文档没有deepEqual功能。 我正在用e2e测试使用nightwatch,并且需要测试用例中的chai函数。 – Jaimin

+0

明白了..夜视使用节点js断言模块。 https://nodejs.org/api/assert.html#assert_assert_deepequal_actual_expected_message – Jaimin

0

你可以试试这个:

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用于端到端测试,它不针对数据库测试,我认为你应该找到另一个框架来测试数据库连接。

+0

感谢您的回答,但回调后测试执行仍然挂起。我认为这个问题与处理承诺有关。 – foureyes