Модульное тестирование события Exec stdout NodeJS

У меня есть код ниже.

//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);
        }
    })

Пожалуйста посоветуй.

Это должно быть выполнимо путем заглушки свойства stdout с помощью EventEmitter и запуска события data в EventEmitter. Пожалуйста, опубликуйте свой тестовый код, если вы не можете заставить его работать.

Ben 22.03.2022 14:14

Спасибо @Ben. Из того, что я понял из вашего ответа, я пробовал. К сожалению, не удалось сделать это должным образом. Я отредактировал свой пост с тестовыми примерами. Было бы очень полезно, если бы вы указали на мою ошибку.

DhruvAgrawal 22.03.2022 16:07
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
2
39
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я пробовал пару вещей. Наконец, мои тестовые примеры были пройдены нижеприведенным решением.

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");
    })

Я не уверен, правильный это путь или нет. Если у кого-то есть лучшее решение, пожалуйста, посоветуйте.

Другие вопросы по теме