这是我要测试的功能。它将从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]有它的值(我通过控制台测试它)
请帮帮我
答案 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();
});
});
});
});