2014-04-12 6 views
8

Sto provando a testare l'output del processo figlio con moka.Testing child_process.exec stdout

Il mio test è simile al seguente:

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

Il problema che sto avendo è che il it non viene mai eseguito.

ho potuto scambiare il codice in giro, per avere la exec all'interno del it e quindi utilizzare done per garantire le cose correre nel giusto ordine, ma ciò significherebbe che avrei dovuto eseguire la stessa exec per ogni prova che voglio fare contro lo stdout del bambino.

Come posso avere più istruzioni it rispetto allo stdout di un processo figlio?

risposta

18

Mocha non è progettato per eseguire il codice visualizzato nella domanda. Potresti pensarlo come in due fasi. Nella prima fase, legge tutti i file di test e li esegue. Il modo in cui sa quali test hai nella tua suite è eseguire immediatamente tutti i callback a describe, e ogni volta che incontra it registra come prova da eseguire successivamente. Nella seconda fase, esegue i test. Quindi, affinché un test sia visibile a Mocha, deve aver visto una chiamata it nella prima fase. Il codice mostrato impedirà che ciò accada.

Come posso avere più istruzioni contro lo stdout di un processo figlio?

Sembra che si stia puntando a una affermazione per it. Non sono sicuro del motivo per cui vuoi farlo nel tuo caso specifico. Più affermazioni nello stesso test vanno perfettamente bene. In ogni caso, se si deve farlo allora si potrebbe utilizzare un gancio 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 richiamata passato a before verrà eseguito prima di tutti i test del genitore describe. I dati da testare vengono acquisiti in captured_stdout e quindi i test possono accedervi e testarli.

+0

~ 200 visualizzazioni ma nessun upvotes? + 1 per la risposta e la spiegazione di tipo tutorial. – scaryguy

0

Anni dopo, la moka è scaduta e supports testing asynchronous code.

Basta aggiungere un callback (di solito denominato done) a it() e Mocha saprà che è necessario attendere che questa funzione venga chiamata per completare il test.

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