首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Node-Redis Asynchrounous的mocha测试

Node-Redis Asynchrounous的mocha测试
EN

Stack Overflow用户
提问于 2014-02-19 02:24:38
回答 1查看 2.8K关注 0票数 2

我有一个用Node.JS编写的简单异步代码,它向Redis集添加了一个字符串。下面是代码,它保存在一个名为redis_ops.js的文件中

代码语言:javascript
复制
 var redis = require('redis');
 exports.addUser= function(){
    var client = redis.createClient();
    client.on("error",function(err){
        console.log('Error'+ err);
    });
   client.select(1);
   client.sadd("users","naveen",function(err,reply){
        if(err)
            throw err;
        return reply;

   });
  console.log("at the end of the adduser function")
  }

由于client.sadd是异步的,所以包含client.sadd的函数在client.sdd完成之前返回。下面是用Mocha编写的测试

代码语言:javascript
复制
var assert = require("assert");
var core = require('./redis_ops.js');

describe('COREAPI', function(){
    describe('addUser', function(){
        it('should return 1 if the user is added successfully', function(){
        assert.equal(1,core.addUser() );

    })
  })
})

测试失败,因为redis_ops返回未定义的值(没有返回值),因为包含client.sadd的函数首先返回,而异步client.sadd返回的是测试中要声明的预期值。如何测试在不重复代码或不包含同一文件中的所有代码的情况下,从异步client.sadd返回值?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-19 02:32:48

Mocha允许您使用可选回调测试异步函数。

代码语言:javascript
复制
describe('COREAPI', function () {
    describe('addUser', function () {
        it('should return 1 if the user is added successfully', function (done) {
            core.addUser(function (err, result) {
                assert.ifError(err);
                assert.equal(result, 1);
                done();
            });
        });
    });
});

您的redis_ops.js文件有问题。不能向异步函数提交回调。按照惯例,回调可能只接受一个错误作为第一个参数(如果没有错误,则为null ),以及用于结果的其他参数。

抛入您的代码将导致不透明的异常,即使您尝试约克它,因为尝试-捕捉只适用于同步代码。您必须将此格式改为如下所示:

代码语言:javascript
复制
var client = require('redis').createClient();

client.on('error', function (err) {
    console.error(err);
});

exports.addUser = function () {
    client.select(1, function (err) {
        if (err) {
            return callback(err)
        }

        client.sadd('users', 'naveen', function (err, reply) {
            if (err) {
                return callback(err);
            }

            console.log('at the end of the adduser function')

            callback(null, reply);
        });
    });
};

或者使用redis模块的client.multi批处理工具,exports.addUser可能如下所示:

代码语言:javascript
复制
exports.addUser = function () {
    var multi = client.multi();

    multi.select(1).sadd('users', 'naveen').exec(function (err, results) {
        if (err) {
            return callback(err);
        }

        callback(null, results[1]);
    });
};
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21869768

复制
相关文章

相似问题

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