测试child_process.exec stdout

时间:2014-04-12 11:45:41

标签: node.js mocha

我正在尝试用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');
      })
    })
  })
})

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

我可以交换代码,将exec放在it内,然后使用done确保按正确的顺序运行,但这意味着我有为我想针对孩子的标准输出的每个测试运行相同的exec。

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

2 个答案:

答案 0 :(得分:20)

Mocha不是为运行您在问题中显示的代码而设计的。您可以将其视为分两个阶段运行。在第一阶段,它会读取所有测试文件并执行它们。它知道你的套件中有什么测试的方法是立即执行所有回调describe,每次遇到it时,它的记录都是以后运行的测试。在第二阶段,它运行测试。因此,对于Mocha可见的测试,它必须在第一阶段看到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');
        });
    });
});

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

答案 1 :(得分:2)

多年以后,摩卡已经成熟并supports testing asynchronous code

只需将回调(通常名为done)添加到it(),Mocha就会知道它应该等待调用此函数来完成测试。

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