无法连接到fakeredis实例(Nodejs + Redis + Fakeredis)

时间:2015-07-18 10:12:55

标签: node.js unit-testing redis

我用redis编写nodejs app。我想在单元测试中模拟我的redis连接。我使用fakeredis模块来存根我的数据。 但我在测试中创建redis密钥时遇到问题。我可以在测试中获得所有密钥,但它们在代码中是不可用的。

就像我的代码没有连接到fakeredis实例一样。 我尝试设置端口和主机,还尝试了另一个模块redis-mock。

应用:

var redis = require('redis');
var redisClient = redis.createClient(6379, '127.0.0.1', {});

redisClient.keys('*', function(error, reply){
    console.log('KEYS', reply); // Problem: it's empty array 
});

规格:

var assert    = require('chai').assert;
var fakeredis = require('fakeredis');
var fakeredisClient;

before(function() {
    fakeredisClient = fakeredis.createClient();
});

beforeEach(function() {

    // Mock data - Set random keys
    fakeredisClient.set('FOO', 'BAR');

});

afterEach(function(done){
    fakeredisClient.flushdb(function(err, reply){
        assert.ok(reply);
        done();
    });
});

1 个答案:

答案 0 :(得分:0)

上面的代码中有一些不正确的地方。

首先,您需要在应用程序代码中模拟fakeredis模块来代替redis模块。一种方法是使用mockery库。

下一个问题是,您的测试中的fakeredis.createClient(...)调用必须与应用代码中的redis.createClient(...)调用相匹配。这意味着您需要将相同的配置变量读入测试中。另一种方法是使用sinon重载fakeredis.createClient()函数,以便始终返回我们的测试client

var mockery = require('mockery')
  , fakeredis = require('fakeredis')

  /* This should exactly match the app connection settings 
     if you aren't stubbing the createClient() method using 
     sinon. */
  , client = fakeredis.createClient('test') 

  /* If your connection settings aren't an exact match (or 
     use the defaults via an empty constructor, you need to 
     stub using sinon */
  , sinon = require('sinon')

// run before the tests start
before(function() {

    // Enable mockery to mock objects
    mockery.enable({
        warnOnUnregistered: false
    });

    // Stub the createClient method to *always* return the client created above
    sinon.stub(fakeredis, 'createClient', function(){ return client; } );

    // Override the redis module with our fakeredis instance
    mockery.registerMock('redis', fakeredis);
}

// run after each test
afterEach(function(){
    client.flushdb();
});