使用摩卡的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]); }); };