Ваше мышление здесь кажется почти полностью неправильным.
Прежде всего, вы пишете и используете setExp
, как будто это синхронная операция, но это не так.Он вернется до того, как будет сделан запрос к Redis.Он также никогда ничего не возвращает, поэтому, даже если он был синхронным, result
в ваших тестах всегда будет undefined.
Вам необходимо изменить setExp
как асинхронную операцию, либо с помощью async
ключевое слово, возвращающее обещание или позволяющее ему принять функцию обратного вызова.
Во-вторых, если вы хотите установить срок действия для ключа Redis, вы должны установить его при установке самого ключа вместо установкиключ без истечения срока действия, а затем пытается добавить срок действия позже.В противном случае вы рискуете потерять настройку срока действия, а затем закроете потерянным ключом, срок действия которого никогда не истечет.в документах node_redis :
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');