2016-08-31 3 views
1

ich dieses Stück Code haben:Wie man readline.on ('SIGINT') vortäuscht?

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); 
    }); 
} 

Ich versuche, um diese Funktion zu testen, mein Versuch, so weit dies:

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); 
    }); 
}); 

Aber natürlich, dass simuliert nicht a SIGINT, wie mache ich das?

Antwort

2

Ich glaube, Sie brauchen eine andere Einstellung:

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; 
}); 

Das zurückgegebene Objekt von readline.createInterface() erbt von EventEmitter, so dass das, was der Stub zurück. Die zusätzliche Funktion close wird einfach hinzugefügt, um Fehler beim Aufruf zu vermeiden.

Sie können das Versprechen, das von getMsg zurückgegeben wird, nicht direkt zurückgeben, da das keine Chance gibt, das SIGINT "Signal" auszugeben (wirklich nur ein Ereignis, aber zu Testzwecken wird es gut funktionieren). Also ist das Versprechen gespeichert.

Der Test sollte mit dem "fullen" -Handler fehlschlagen, der aufgerufen werden musste, was explizit gemacht werden musste, ansonsten glaubt Mocha, dass der Test bestanden wurde.

Als nächstes wird die SIGINT gesendet (was den Ablehnungshandler wie beabsichtigt auslösen sollte), und das Versprechen wird zurückgegeben.

+0

Ich verstehe die Ablehnung vs fangen. Keine Notwendigkeit, dies zu erweitern. –

+0

Danke für den Emitter, ich wusste nicht, dass es existiert. Ich werde es ausprobieren. –

+0

@RafaelBarros Ich entfernte es, um den Lärm zu verringern :) – robertklep

Verwandte Themen