使用mock-cli测试readline模块的单元测试方案咨询
为基于readline的Node.js CLI模块编写单元测试
我来帮你完善这个单元测试!你的模块是一个简单的CLI工具,通过readline读取标准输入,将指定字符串替换后输出到标准输出。我们可以用mock-cli来模拟输入、输出和命令行参数,轻松完成单元测试。
原模块代码(cli.js)
#!/usr/bin/env node const args = process.argv.slice(2) var readline = require('readline') var rl = readline.createInterface({ input: process.stdin, output: process.stdout, terminal: false }) rl.on('line', (line) => { process.stdout.write(line.replace(args[0], args[1]) + '\n') }).on('close', () => { process.exit(0) })
完善后的单元测试代码
首先确保你已经安装了必要的测试依赖:
npm install --save-dev mock-cli mocha
然后编写测试文件(比如test/cli.test.js):
const mockCli = require('mock-cli'); const assert = require('assert'); const path = require('path'); describe('CLI字符串替换工具', () => { // 测试正常替换场景 it('应该正确替换每行中的目标字符串', (done) => { // 模拟的标准输入内容 const testInput = 'hello world\nfoo bar hello\nhello hello'; // 模拟命令行参数:把'hello'替换成'hi' const mockArgv = ['node', path.join(__dirname, '../cli.js'), 'hello', 'hi']; mockCli({ stdin: testInput, argv: mockArgv }, (err, stdout, stderr) => { if (err) return done(err); // 预期的输出结果 const expectedOutput = 'hi world\nfoo bar hi\nhi hi\n'; // 验证输出是否符合预期 assert.strictEqual(stdout, expectedOutput); // 验证没有错误输出 assert.strictEqual(stderr, ''); done(); }); }); // 测试空输入场景 it('处理空输入时应该输出空内容', (done) => { const mockArgv = ['node', path.join(__dirname, '../cli.js'), 'a', 'b']; mockCli({ stdin: '', argv: mockArgv }, (err, stdout, stderr) => { if (err) return done(err); assert.strictEqual(stdout, ''); assert.strictEqual(stderr, ''); done(); }); }); });
测试运行与说明
- 运行测试的命令:
npx mocha test/cli.test.js mock-cli会帮我们完全模拟process.stdin、process.stdout和process.argv,不需要修改原模块的任何代码- 第一个测试用例验证核心替换功能,覆盖多行输入的场景
- 第二个测试用例验证边界情况,确保模块在空输入时不会崩溃
内容的提问来源于stack exchange,提问作者ThomasReggi
相关产品推荐
相关产品推荐

