Redis mocha测试用例问题

时间:2018-05-25 05:53:22

标签: express mocha node-redis

我有一个文件调用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');

请建议我实现这一目标的正确方法。

1 个答案:

答案 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);
        });
    });
});

此外,resultsresult不是一回事。在您的测试用例中,没有名为results的变量。

哦,不要这样做:

var cache = require(path.join(__dirname,'..','/cache'));

require已经支持相对于__dirname的路径。就这样做:

var cache = require('../cache');