我正在尝试学习如何使用NodeUnit来测试我的NodeJs代码。我已经编写了以下代码,但是每次运行测试时,结果都是OK: 0个断言,无论输入参数是否有效。有没有人能解释为什么这个不起作用,以及我如何修复它?
auth.class.js:此函数接受用户ID并返回用户名。
exports.username = function(uid, callback) {
db.query('SELECT username FROM ul_logins WHERE id=?', uid, function(err, results){
if (err) throw new Error(err);
if(results.length > 0)
{
callback(null, results[0].username);
}
else
throw new Error("No results.");
});
};authtest.js:无论uid是什么,这个测试每次都会成功运行,并将断言计数为0。
var auth = require('./auth.class.js');
exports['username'] = function (test) {
auth.username(1, function(err, data){
return test.equal(data, "joe@example.com");
});
test.done();
};发布于 2014-02-10 07:43:44
您正在测试的函数是异步的(请参阅下面重写的函数)。您需要将test.done()放在回调函数中:
exports['username'] = function (test) {
test.expect(2);
auth.username(1, function (err, data) {
test.ifError(err);
test.equal(data, 'joe@example.com');
test.done();
});
};在您的版本中,在调用auth.username的回调之前调用test.done。使用test.expect告诉nodeunit在调用test.done之前它应该接收多少个断言。
您的auth.username函数有一个严重的问题。您不应该抛出异步代码,因为try-catch不能用于捕获错误,从而导致未捕获的异常。应始终将异步代码中的错误作为第一个参数传递给回调(约定)。您的函数应如下所示:
exports.username = function (uid, callback) {
var query = 'SELECT username FROM ul_logins WHERE id=?';
db.query(query, uid, function (err, results) {
if (err) {
return callback(err);
}
if (results.length === 0) {
return callback(new Error('No user found.'));
}
callback(null, results[0].username);
});
};请注意,首先处理错误(保持代码整洁),然后返回分支中的回调调用,以避免多次调用回调(使用else增加了一定程度的缩进)。
我得到的印象是您是Node的新手,我记得在这一点上也遇到了困难。将在网络上执行某些操作的任何函数视为异步函数。这可能需要很长时间,因此为了避免阻塞进程,Node让操作系统处理任务,并在将来操作系统给出结果时进行回调调用。这就是Node如此依赖回调的原因。它让节点进程在等待时可以自由地做其他事情(比如在问题中调用test.done )。这也意味着try-catch (它只能捕获在同一“tick”中抛出的错误)不再起作用。处理错误的传统方法是以错误作为第一个参数调用回调。所有其他参数都是针对实际结果的。
https://stackoverflow.com/questions/21666534
复制相似问题