我有一个用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() );
})
})
})
测试失败,因为redis_ops返回undefined(没有返回值),因为包含client.sadd的函数首先返回,异步client.sadd稍后返回,并在测试中确定要声明的值。如何在没有代码重复或不包含同一文件中的所有代码的情况下测试从异步client.sadd返回值?
答案 0 :(得分:3)
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仅适用于同步代码。您必须将其重新格式化为:
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]);
});
};