2016-08-31 3 views
1

나는이 코드 조각이 :readline.on ('SIGINT')을 조롱하는 방법?

function getMsg() { 
    return new Promise(function (resolve, reject) { 
    var input = []; 
    var rl = readline.createInterface({ 
     input: process.stdin, 
     output: process.stdout 
    }); 
    rl.on('line', function (cmd) { 
     if (cmd.trim()) { 
     input.push(cmd); 
     } else { 
     rl.close(); 
     } 
    }); 
    rl.on('close', function() { 
     rl.close(); 
     resolve(input.join('\n')); 
    }); 
    rl.on('SIGINT', reject); 
    }); 
} 

나는이 기능, 내 시도를 테스트하기 위해 노력하고있어가, 지금까지 이것이다 :

it('should reject if SIGINT is sent', function() { 
    sandbox.stub(readline, 'createInterface', function() { 
    return { 
     on: function (action, callback) { 
     callback(); 
     }, 
     prompt: function() {}, 
     close: function() {} 
    }; 
    }); 

    return getMsg().then(null).catch(function() { 
    expect(true).to.be.equal(true); 
    }); 
}); 

그러나 물론, 시뮬레이션하지 않습니다 a SIGINT, 어떻게해야합니까?

답변

2

나는 다른 설정을 필요가 있다고 생각 :

const EventEmitter = require('events').EventEmitter 
... 
it('should reject if SIGINT is sent', function() { 
    let emitter = new EventEmitter(); 
    sandbox.stub(readline, 'createInterface', function() { 
    emitter.close =() => {}; 
    return emitter; 
    }); 

    let promise = getMsg().then(function() { 
    throw Error('should not have resolved'); 
    }, function (err) { 
    expect(true).to.be.equal(true); 
    }); 

    emitter.emit('SIGINT'); 

    return promise; 
}); 

EventEmitter에서 readline.createInterface() 상속에 의해 반환되는 객체, 즉 스텁이 반환됩니다 무엇 때문에. 추가 close 함수는 호출시 오류를 방지하기 위해 함수에 간단히 추가됩니다.

getMsg에 의해 반환 된 약속을 직접적으로 반환 할 수는 없으므로 SIGINT "신호"(실제로는 이벤트이지만 테스트 목적으로는 잘 작동합니다)를 낼 수는 없기 때문입니다. 그래서 약속이 저장됩니다.

"fulfilled"핸들러가 호출되면 테스트가 실패합니다. 명시 적으로 수행해야합니다. 그렇지 않으면 모카가 테스트를 통과했다고 생각합니다.

다음으로 SIGINT이 보내집니다 (의도 한대로 거부 처리기를 트리거해야 함). 약속이 반환됩니다.

+0

나는 거부 대 캐치를 이해합니다. 확장 할 필요가 없습니다. –

+0

이미 터에 감사드립니다. 존재하지 않았다. 나는 그것을 밖으로 시도 할 것이다. –

+0

@RafaelBarros 노이즈를 줄이기 위해 제거했습니다. – robertklep