使用摩卡的Node-Redis Asynchrounoustesting

我有一个用Node.JS编写的简单asynchronous代码,它向Redis SET添加一个string。 这里是代码,它保存在一个名为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是asynchronous的,因此包含client.sadd的函数在client.sdd完成之前返回。 这是使用摩卡书写的testing

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

testing失败,因为redis_ops返回undefined(无返回值),因为包含client.sadd的函数首先返回,而asynchronousclient.sadd稍后返回,并且在testing中声明预期值。 我如何testing从asynchronousclient.sadd返回值没有代码重复或不包含在同一个文件中的所有代码?

摩卡允许您使用可选的callback来testingasynchronous函数。

 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文件有问题。 您不得向callbackasynchronous函数。 按照惯例,callback函数可能只会将错误作为第一个参数(如果没有错误,则为null)以及其他参数。

抛出你的代码将导致未捕获的exception,即使你尝试哟赶上它,因为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]); }); };