2014-12-09 2 views
0

필자가 작성한 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

어디에서나 클라이언트의 연결을 끊으시겠습니까? – mscdex

+0

번호. 방금 연결할 수 있는지 테스트하고 싶었습니다. 분리가 필요합니까? – user70192

+0

연결이 끊어지는 afterEach가 있어야합니다. 그렇지 않으면 테스트가 완료 되더라도 노드는 연결을 끊을 수 없음을 알 수 없습니다. – loganfsmyth

답변

0

오픈 소켓은 노드 프로세스를 열린 상태로 유지하는 한 가지 요소입니다. 프로세스가 자연스럽게 종료되도록하려면 테스트가 완료된 후 클라이언트의 연결을 끊어야합니다.