单元测试 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");
})
我不确定这是否正确。如果谁有更好的解决办法,请指教
我有以下代码。
//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");
})
我不确定这是否正确。如果谁有更好的解决办法,请指教