我正在尝试用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
语句?
答案 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();
})
})
})
})