2014-04-12 6 views
8

Ich versuche, die Ausgabe von Kind Prozess mit Mokka zu testen.Testen child_process.exec stdout

Mein Test wie folgt aussieht:

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

Das Problem, das ich habe, ist, dass die it nie ausgeführt wird.

ich den Code um tauschen könnte, die exec innerhalb der it zu haben und dann done verwenden, um Dinge in der richtigen Reihenfolge ausgeführt werden, um sicherzustellen, aber das würde bedeuten, ich die gleiche exec für jeden Test Ich mag laufen müsste gegen die stdout des Kindes machen.

Wie kann ich mehrere it Anweisungen gegen den Stand eines Kindprozesses haben?

Antwort

18

Mocha ist nicht entworfen, um den Code auszuführen, den Sie in Ihrer Frage zeigen. Man könnte sich vorstellen, dass es in zwei Phasen läuft. In der ersten Phase liest es alle Ihre Testdateien und führt sie aus. Die Art, wie es weiß, welche Tests Sie in Ihrer Suite haben, besteht darin, sofort alle Callbacks auf describe auszuführen, und jedes Mal, wenn es auf it trifft, werden die Datensätze als Test später ausgeführt. In der zweiten Phase führt es die Tests durch. Damit ein Test für Mocha sichtbar ist, muss er in der ersten Phase einen Aufruf für it gesehen haben. Der Code, den Sie anzeigen, wird dies verhindern.

Wie kann ich mehrere It-Anweisungen gegen den Stand eines Kindprozesses haben?

Es klingt, als ob Sie eine Behauptung pro it anstreben. Ich bin nicht sicher, warum Sie das in Ihrem speziellen Fall tun möchten. Mehrere Behauptungen in demselben Test sind völlig in Ordnung. Auf jeden Fall, wenn Sie es tun müssen, dann könnten Sie einen before Haken verwenden:

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

Der Rückruf an before weitergegeben wird in der Mutter describe vor allen Tests ausgeführt werden. Die zu testenden Daten werden in captured_stdout erfasst und dann können alle Tests darauf zugreifen und dagegen testen.

+0

~ 200 ansichten aber keine upvotes? + 1 für Tutorial-ähnliche Antwort und Erklärung. – scaryguy

0

Jahre später ist Mokka gereift und supports testing asynchronous code.

Fügen Sie einfach einen Rückruf (normalerweise done) zu it() hinzu und Mocha wird wissen, dass es warten sollte, bis diese Funktion aufgerufen wird, um den Test abzuschließen.

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