首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NodeUnit测试mysql函数测试总是成功

NodeUnit测试mysql函数测试总是成功
EN

Stack Overflow用户
提问于 2014-02-10 07:27:30
回答 1查看 109关注 0票数 0

我正在尝试学习如何使用NodeUnit来测试我的NodeJs代码。我已经编写了以下代码,但是每次运行测试时,结果都是OK: 0个断言,无论输入参数是否有效。有没有人能解释为什么这个不起作用,以及我如何修复它?

auth.class.js:此函数接受用户ID并返回用户名。

代码语言:javascript
复制
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。

代码语言:javascript
复制
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();
};
EN

回答 1

Stack Overflow用户

发布于 2014-02-10 07:43:44

您正在测试的函数是异步的(请参阅下面重写的函数)。您需要将test.done()放在回调函数中:

代码语言:javascript
复制
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不能用于捕获错误,从而导致未捕获的异常。应始终将异步代码中的错误作为第一个参数传递给回调(约定)。您的函数应如下所示:

代码语言:javascript
复制
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”中抛出的错误)不再起作用。处理错误的传统方法是以错误作为第一个参数调用回调。所有其他参数都是针对实际结果的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21666534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档