单元测试 Exec stdout 事件 NodeJS

Unit testing an Exec stdout event 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.log("Error", error);
            reject(error);
        }
    })
}

这里有一个匿名函数,当 exec 进程的标准输出发出数据事件时会触发该函数。我无法控制 bash.js 的输出,所需的响应可能需要 5 到 10 秒。此外,我无法添加计时器并等待此事件触发,因为我已经使用 sinon 模拟了 exec 响应。所以没有真正调用bash.js。那么我如何手动发出此事件并查看是否计算了业务逻辑?我是 Javascript 中的单元测试新手。目前我正在使用 mocha 和 sinon 来满足我的单元测试要求。

我有以下测试用例,但它没有按预期工作..

//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.log("Error in test cases: ", error);
        }
    })

请指教

我已经尝试了一些东西。最后,我的测试用例通过了以下解决方案。

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

我不确定这是否正确。如果谁有更好的解决办法,请指教