Тестирование выходного файла child_process.exec
Я пытаюсь проверить вывод дочернего процесса с мокко.
Мой тест выглядит так:
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
заявления против stdout дочернего процесса?
2 ответа
Mocha не предназначен для запуска кода, который вы показываете в своем вопросе. Вы можете думать об этом как о работе в два этапа. На первом этапе он читает все ваши тестовые файлы и выполняет их. Он знает, какие тесты у вас есть в вашем наборе, выполняя все обратные вызовы describe
немедленно, и каждый раз, когда он сталкивается it
это записи как тест для запуска позже. На втором этапе запускаются тесты. Поэтому для того, чтобы тест был виден Мокко, он должен был увидеть it
призыв к этому на первом этапе. Код, который вы показываете, предотвратит это.
Как я могу иметь несколько операторов it против stdout дочернего процесса?
Похоже, вы стремитесь к одному утверждению за 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
и тогда все тесты смогут получить к нему доступ и протестировать его.
Спустя годы mocha повзрослел и поддерживает тестирование асинхронного кода.
Просто добавьте обратный вызов (обычно с именем done
) чтобы it()
и Мокко будет знать, что он должен ждать вызова этой функции для завершения теста.
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();
})
})
})
})