Probando child_process.exec stdout

Estoy tratando de probar la salida del proceso hijo con mocha.

Mi prueba se ve así:

var should = require("should"), exec = require("child_process").exec; describe('users', function() { describe('andrei', function() { exec('id andrei', function(error, stdout, stderr) { it('should be part of group dev', function() { stdout.should.containEql('dev'); }) }) }) }) 

El problema que tengo es que nunca se ejecuta.

Podría intercambiar el código para tener el exec dentro y luego usarlo para asegurar que todo funcione en el orden correcto, pero eso significaría que tendría que ejecutar el mismo exec para cada prueba que quiero hacer contra el niño. stdout

¿Cómo puedo tener varias declaraciones it contra el stdout de un proceso hijo?

Mocha no está diseñado para ejecutar el código que muestra en su pregunta. Se podría pensar que se ejecuta en dos fases. En la primera fase, lee todos los archivos de prueba y los ejecuta. La forma en que sabe qué pruebas tiene en su suite es mediante la ejecución de todas las devoluciones de llamada para describe inmediato, y cada vez que la encuentra it la registra como una prueba que se ejecutará más adelante . En la segunda fase, ejecuta las pruebas. Por lo tanto, para que una prueba sea visible para Mocha, debe haberla visto en la primera fase. El código que muestres evitará que esto suceda.

¿Cómo puedo tener varias declaraciones it contra el stdout de un proceso hijo?

Parece que estás apuntando a una aserción por it . No estoy seguro de por qué quieres hacer esto en tu caso específico. Múltiples afirmaciones en la misma prueba está perfectamente bien. En cualquier caso, si debe hacerlo, puede usar un gancho before :

 var should = require("should"), exec = require("child_process").exec; describe('users', function() { describe('andrei', function() { var captured_stdout; before(function (done) { exec('id andrei', function (error, stdout, stderr) { if (error) done(error); // Handle errors. captured_stdout = stdout; done(); }); }); it('should be part of group dev', function() { captured_stdout.should.containEql('dev'); }); }); }); 

La callback pasada a before se ejecutará antes de que se describe todas las pruebas en el padre. Los datos a probar se capturan en captured_stdout y luego todas las pruebas pueden acceder a ella y probarla.

Años más tarde, mocha ha madurado y soporta pruebas de código asíncrono .

Simplemente agregue una callback (normalmente con el nombre done ) a it() y Mocha sabrá que debe esperar a que se llame a esta función para completar la prueba.

 const should = require("should"), { exec } = require("child_process"); describe('users', function() { describe('andrei', function() { it('should be part of group dev', function(done) { exec('id andrei', function(error, stdout, stderr) { stdout.should.containEql('dev'); done(); }) }) }) })