Redis mocha Тестовый кейс - PullRequest
0 голосов
/ 25 мая 2018

У меня есть один вызов файла 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 всегда возвращает мне ошибку как 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

var result = cache.setExp('foo', 10, []);

это должно вернуть мне ошибку, названную ERRневерное количество аргументов для команды 'set'

var result = cache.setExp(undefined, 0, []);

Следует принять приведенный ниже журнал ошибок как assert.equal (err.command, 'SET');

Пожалуйста, предложите мне правильный путьдля достижения этой цели.

1 Ответ

0 голосов
/ 29 мая 2018

Ваше мышление здесь кажется почти полностью неправильным.

Прежде всего, вы пишете и используете 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');
...