Tengo el siguiente código.
//utils.js const cp = require('child_process'); module.exports.execuateBashCommand = ()=> { return new Promise((resolve, reject)=> { try { cp.exec('bash bash.sh').stdout.on('data', (response)=> { if (response.toString().indexOf("Success") > -1) { //Some business logic const result = "working"; resolve(result); } }); } catch (error) { console.log("Error", error); reject(error); } }) }Aquí, hay una función anónima que se activa cuando la salida estándar del proceso exec emite un evento de datos. No tengo control sobre la salida de bash.js, la respuesta deseada puede tardar de 5 a 10 segundos. Además, no puedo agregar un temporizador y esperar a que se active este evento, ya que me he burlado de la respuesta ejecutiva usando sinon. Entonces no hay una llamada real a bash.js. Entonces, ¿cómo puedo emitir este evento manualmente y ver si se calcula la lógica comercial? Soy nuevo en las pruebas unitarias en Javascript. Actualmente estoy usando mocha y sinon para los requisitos de prueba de mi unidad.
Tengo el siguiente caso de prueba, pero no funciona como se esperaba.
//utils.test.js it("1. test case", (done)=> { try { const mockStdout = new events.EventEmitter(); mockStdout.on('data', ()=> { return "Success"; }); mockStdout.emit('data'); sandbox.stub(cp.exec('test test'), 'stdout').returns(mockStdout); utils.execuateBashCommand().then((result)=> { assert(data, "working"); done(); }); } catch (error) { console.log("Error in test cases: ", error); } })Por favor aconséjame.
He intentado un par de cosas. Finalmente, mis casos de prueba fueron aprobados por la siguiente solución.
it("1. test case", (done) => { const fake = { stdout: new EventEmitter(), } fake.stdout.on('data', () => { }); sinon.stub(cp, 'exec').returns(fake); utils.execuateBashCommand().then((res) => { expect(res, true); done(); }); fake.stdout.emit('data', "Success"); })No estoy seguro de si esta es la forma correcta o no. Si alguien tiene una mejor solución, por favor consejo.