У меня есть код ниже.
//utils.js
const cp = require('child_process');
module.exports.execuateBashCommand = ()=> {
return new Promise((resolve, reject)=> {
try {
cp.exec('bash bash.sh').stdout.on('data', (response)=> {
if (response.toString().indexOf("Success") > -1) {
//Some business logic
const result = "working";
resolve(result);
}
});
} catch (error) {
console.info("Error", error);
reject(error);
}
})
}
Здесь есть анонимная функция, которая запускается, когда событие данных генерируется стандартным выводом процесса exec. У меня нет контроля над выводом bash.js, желаемый ответ может занять от 5 до 10 секунд. Также я не могу добавить таймер и дождаться срабатывания этого события, поскольку я издевался над ответом exec, используя sinon. Таким образом, нет никакого реального обращения к bash.js. Итак, как я могу сгенерировать это событие вручную и посмотреть, будет ли вычислена бизнес-логика? Я новичок в модульном тестировании в Javascript. В настоящее время я использую мокко и синон для своих требований к модульному тестированию.
У меня есть следующий тестовый пример, но он не работает должным образом.
//utils.test.js
it("1. test case", (done)=> {
try {
const mockStdout = new events.EventEmitter();
mockStdout.on('data', ()=> {
return "Success";
});
mockStdout.emit('data');
sandbox.stub(cp.exec('test test'), 'stdout').returns(mockStdout);
utils.execuateBashCommand().then((result)=> {
assert(data, "working");
done();
});
} catch (error) {
console.info("Error in test cases: ", error);
}
})
Пожалуйста посоветуй.
Спасибо @Ben. Из того, что я понял из вашего ответа, я пробовал. К сожалению, не удалось сделать это должным образом. Я отредактировал свой пост с тестовыми примерами. Было бы очень полезно, если бы вы указали на мою ошибку.
Я пробовал пару вещей. Наконец, мои тестовые примеры были пройдены нижеприведенным решением.
it("1. test case", (done) => {
const fake = {
stdout: new EventEmitter(),
}
fake.stdout.on('data', () => { });
sinon.stub(cp, 'exec').returns(fake);
utils.execuateBashCommand().then((res) => {
expect(res, true);
done();
});
fake.stdout.emit('data', "Success");
})
Я не уверен, правильный это путь или нет. Если у кого-то есть лучшее решение, пожалуйста, посоветуйте.
Это должно быть выполнимо путем заглушки свойства stdout с помощью EventEmitter и запуска события
data
в EventEmitter. Пожалуйста, опубликуйте свой тестовый код, если вы не можете заставить его работать.