我有一个文件调用cache.js
var redisCache = redis.createClient(port, name);
redisCache.on("error", function(err) {
logger.error("Error connecting to redis", err);
});
exports.setExp = function(key, timeLeft, data){
redisCache.set(key, JSON.stringify(data), function (err, reply) {
console.log("error "+err);
console.log("reply "+reply);
if(err) {
console.log("error "+err.command + err.code);
logger.info("This errror on set key related to node_redis");
}
if(reply == 'OK') {
redisCache.expire(key, timeLeft, function (err, reply) {
if(err) {
logger.info("This errror on expire key related to node_redis");
}
if(reply === 1) {
logger.info(key+" key expire time set as "+timeLeft+" successfully!");
}
});
}
});
}
现在我想为上面的setExp函数编写测试用例,但是有些节点如何将node_redis返回给我{er} null
并回复为OK
下面是我的测试用例。
var cache = require(path.join(__dirname,'..','/cache'));
describe('cache', function () {
it('Cache #setExp() ', function (done) {
var result = cache.setExp(undefined, 0, []);
assert.equal('OK', results);
done()
})
})
如果我更改了它,则应遵循我根据node_redis test case
提及的以下错误var result = cache.setExp('foo', 10, []);
它应该返回一个名为ERR的错误,错误的'set'命令参数数量
var result = cache.setExp(undefined, 0, []);
它应该接受以下错误日志 assert.equal(err.command,'SET');
请建议我实现这一目标的正确方法。
答案 0 :(得分:1)
你的想法在这里几乎完全错了。
首先,您正在编写并使用setExp
,就像它是同步操作一样,但事实并非如此。它将在请求redis之前返回。它也永远不会返回任何内容,所以即使它是同步的,测试中的result
也始终是undefined.
您需要将setExp
重新设计为异步操作,方法是使用async
关键字,返回承诺或让其接受回调函数。
其次,如果要在Redis密钥上设置过期,则应在设置密钥本身时设置它,而不是设置没有过期的密钥,然后尝试稍后添加过期。否则,您将面临失效设置失败的风险,然后使用永不过期的孤立密钥进行清理。
以下是一个示例,使用节点util.promisify作为described in the node_redis docs:
var redis = require('redis');
var {promisify} = require('util');
var redisCache = redis.createClient(port, name);
redisCache.on("error", function(err) {
logger.error("Error connecting to redis", err);
});
var set = promisify(redisCache.set).bind(redisCache);
exports.setExp = function(key, timeLeft, data){
return set(key, JSON.stringify(data), 'EX', timeLeft.toString(10))
.then((reply) => {
if (reply !== 'OK') throw new Error(reply);
return reply;
});
};
在你的测试中,你会做这样的事情:
var cache = require('../cache');
describe('cache', function () {
it('Cache #setExp() ', function () {
let key = 'some key';
let timeLeft = 12345;
let data = { foo: 'bar' };
return cache.setExp(key, timeLeft, data)
.then((result) => {
assert.equal('OK', result);
});
});
});
此外,results
和result
不是一回事。在您的测试用例中,没有名为results
的变量。
哦,不要这样做:
var cache = require(path.join(__dirname,'..','/cache'));
require
已经支持相对于__dirname
的路径。就这样做:
var cache = require('../cache');