异步函数导致Jasmine挂起

时间:2014-12-09 18:13:11

标签: javascript node.js redis

我正在为我编写的JavaScript模块编写一些单元测试。模块的一部分连接到REDIS数据库。我使用node_redis连接到该数据库。我用Jasmine 2.1编写的测试看起来像这样:

var ModuleService = require('./module-service');
describe("TEST", function() {
  var service = new ModuleService();

  var options = null;
  beforeEach(function() {
    options = {
      server: '127.0.0.1',
      port: 6379
    };
  });

  it('Connect to REDIS', function(done) {
    service.connectToRedis(options, function() {
      console.log('call back received.');
      expect(service.state).toBe('Open');
      done();
    });
  });
});

我的测试执行。服务的状态变量设置为“打开”。但是,在命令行中,它只是坐在那里。我必须按Ctrl + C才能返回命令提示符。如果我删除了测试,则立即对命令提示符进行控制。这让我相信我错误地设置了我的异步内容。为了完整起见,我的connectToRedis函数如下所示:

var redis = require('redis');
function ModuleService() {
}
ModuleService.prototype.state = 'Not Ready';

ModuleService.prototype.connectToRedis = function(options, callback) {
  // Ensure that the options are being passed
  if (!options) {
    if (callback) {
      callback(-1);
    }
    return;
  }

  try {
    // Attempt to connect to the REDIS server
    this.state = 'Connecting to REDIS';
    client = redis.createClient(options.port, options.host, null);
    this.state = 'Open';

    if (callback) {
      callback(1);
    }
  } catch (ex) {
    if (callback) {
      callback(-1);
    }
  }
};
module.exports = ModuleService;

我做错了吗?为什么没有控制权返回命令行?

谢谢!

1 个答案:

答案 0 :(得分:0)

打开套接字是保持节点进程打开的一件事。测试完成后,您需要断开客户端连接,以允许进程自然退出。