node.js - 使用 mocha 进行 Node-Redis 异步测试

标签 node.js asynchronous mocha.js node-redis

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

 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 编写的测试

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() );

    })
  })
})

由于包含 client.sadd 的函数首先返回,并且异步 client.sadd 稍后返回并带有要在测试中断言的预期值,因此测试失败,因为 redis_ops 返回未定义(无返回值)。如何测试异步 client.sadd 的返回值,而无需重复代码或不在同一文件中包含所有代码?

最佳答案

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

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),其他参数作为结果。

即使您 try catch 它,代码中的 throw 也会导致未捕获的异常,因为 try-catch 仅适用于同步代码。您必须将其重新格式化为:

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 可能如下所示:

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]);
    });
};

关于node.js - 使用 mocha 进行 Node-Redis 异步测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21869768/

相关文章:

javascript - 使用 Base64 格式的图像向 Face++ 检测 API 发出请求

javascript - Node JS 从 axios 返回数据

macos - Node.js 版本和 Heroku

javascript - 如何使用 swig 创建动态链接,以便我可以在链接上设置事件/非事件类?

c# - 在事件再次触发之前等待事件完成

php - 发送 Guzzle 的 "async"请求而不调用 "wait"

node.js - 使用 serverless-mocha-plugin 测试动态端点

c# - 在 C# 中等待 C++ 中的事件 - 作为任务或等待句柄

node.js - 如何在 Node 中使用 Mocha 和 Chai 测试 Promise 拒绝?

testing - 如何确保对象数组中的所有项目都具有 mocha 中所有必需的键?