测试child_process.exec的标准输出(stdout)

10

我正在尝试使用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来确保按正确顺序运行,但这意味着我必须针对每个要针对子进程的stdout进行测试的测试运行相同的exec

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

2个回答

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中,然后所有测试都可以访问它并根据其进行测试。


200个浏览量但没有点赞?+1给像教程一样的回答和解释。 - scaryguy

2
多年以后,摩卡已经成熟并支持测试异步代码。只需在it()中添加一个回调函数(通常命名为done),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();
      })
    })
  })
})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接