2016-08-31 5 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"ハンドラが呼び出されるとテストが失敗します。明示的に実行する必要があります。そうでなければ、テストが合格したとMochaは考えます。

次に、SIGINTが送信されます(拒否ハンドラが意図したとおりにトリガされるはずです)。約束が返されます。

+0

私は拒否対捕獲を理解します。それを拡張する必要はありません。 –

+0

エミッタのおかげで、私は存在していたか分からなかった。やってみます。 –

+0

@RafaelBarros私はノイズを減らすためにそれを削除しました:) – robertklep

関連する問題