You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:31:56