【问题标题】:Testing child_process.exec stdout测试 child_process.exec 标准输出
【发布时间】:2014-04-12 11:45:40
【问题描述】:

我正在尝试用 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我想针对孩子的标准输出进行的每个测试。

如何针对子进程的标准输出设置多个 it 语句?

【问题讨论】:

    标签: node.js mocha.js


    【解决方案1】:

    Mocha 并非旨在运行您在问题中显示的代码。您可以将其视为分两个阶段运行。在第一阶段,它会读取您的所有测试文件并执行它们。它知道您的套件中有哪些测试的方式是立即执行对describe 的所有回调,并且每次遇到it 时它都会记录为待运行的测试稍后。在第二阶段,它运行测试。因此,对于 Mocha 可见的测试,它必须在第一阶段看到一个 it 调用它。您显示的代码将防止这种情况发生。

    如何针对子进程的标准输出设置多个 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 用于类似教程的答案和解释。
    【解决方案2】:

    多年后,mocha 成熟了,supports testing asynchronous code

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

    【讨论】:

      猜你喜欢
      • 2014-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多