测试child_process.exec stdout

And*_*c ॐ 10 mocha.js node.js

我正试图用mocha测试子进程的输出.

我的测试看起来像这样:

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');
      })
    })
  })
})
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是it永远不会被执行.

我可以交换代码,使exec内部使用it,然后使用done以确保以正确的顺序运行,但这意味着我必须为我想针对孩子的stdout进行的每个测试运行相同的exec.

如何it针对子进程的stdout进行多个语句?

Lou*_*uis 20

Mocha不是为运行您在问题中显示的代码而设计的.您可以将其视为分两个阶段运行.在第一阶段,它会读取所有测试文件并执行它们.它知道你的套件中有什么测试的方法是describe立即执行所有回调,每次遇到it它时,记录都是稍后运行的测试.在第二阶段,它运行测试.因此,对于摩卡可见的测试,它必须it在第一阶段看到它的调用.您显示的代码将阻止这种情况发生.

如何针对子进程的stdout使用多个it语句?

听起来你的目标是一个断言it.我不确定你为什么要在你的具体情况下这样做.同一测试中的多个断言完全没问题.无论如何,如果你必须这样做,那么你可以使用一个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');
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

传递给的回调before将在父级中的所有测试之前运行describe.捕获要测试的数据captured_stdout,然后测试可以访问它并对其进行测试.