在Mocha进行测试时断言并且不应该工作

时间:2016-12-08 10:20:18

标签: mysql callback mocha

这是我要测试的功能。它将从mysql

获取数据库
var mysql      = require('mysql');
var pool = mysql.createPool({
  host     : 'localhost',
  user     : 'root',
  password : 'toor',
  database : 'DB'
});
exports.findById = function(id, callback){
  pool.getConnection(function(err, connection) {
    var row;
    var query = connection.query( "SELECT * FROM Users WHERE id = '" + id + "'", function(err, rows) {
       connection.release();
       callback(null,rows[0]);
     });
     console.log(query.sql);
  });
}

我为此功能进行手动测试。 rows [0]的值应该是这样的

var user = {
        id: 1,
        username: 'test',
        password: '123',
        name: 'test user',
        phone: '01699924568'
      }

所以这是我为它写的测试

var User = require('../Lib/users.js');
var assert = require('assert');
var should = require('should');
describe('Test User Class', function() {
  describe('Test case 1: Load user with id from database', function() {
    it('should return user with id = 1 in database', function() {
      User.findById(1, function(error, rows){
        rows.id.should.be.equal(2)
      });
    });
  });
});

此测试应该导致错误,因为返回的id是1(不是2)。然而,它并没有像预期的那样发生,测试通过了。 我真的生气这个错误。我试过很多方法,比如让exports.findById函数返回行[0],但它返回undefined尽管rows [0]有它的值(我通过控制台测试它) 请帮帮我

1 个答案:

答案 0 :(得分:0)

您需要以某种方式告诉mocha测试是异步的。

您的findById函数不会阻止线程中的执行来执行操作,但它正在进行回调:这意味着它是一个异步函数。

mocha通知你有异步测试,你有两个选择:

  • 使用done回拨
  • 如果您有一个
  • ,则返回承诺

在你的情况下,你没有任何承诺,所以你必须使用结构方式。

var User = require('../Lib/users.js');
var assert = require('assert');
var should = require('should');
describe('Test User Class', function() {
  describe('Test case 1: Load user with id from database', function() {
    it('should return user with id = 1 in database', function( done ) {
      User.findById(1, function(error, rows){
        rows.id.should.be.equal(2);
        // now tell mocha you're done with the test
        done();
      });
    });
  });
});