0

stdin が提供する stdout を解釈する readline を使用して、モジュールの単体テストを作成しようとしています。

モジュール:

#!/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)
})

テスト:

var mockCli = require('mock-cli')
var assert = require('assert')
var util = require('util')
var Readable = require('stream').Readable

function createReadableStream(input, callback) {
  input = input || null;

  function ReadableStream(options) {
    Readable.call(this, options);
  }

  util.inherits(ReadableStream, Readable);

  ReadableStream.prototype._read = function(size) {
    if (callback) { callback(input); }
    this.push(input);
    input = null;
  };

  return new ReadableStream();
}

var argv = ['node', './index.js', 'world', 'thomas']
var stdio = {
  stdin: createReadableStream('Hello, world\n'),
  stdout: process.stdout, // Display the captured output in the main console
  stderr: process.stderr // Display the captured error output in the main console
}

var kill = mockCli(argv, stdio, (error, result) => {
  if (error) throw error
  var exitCode = result.code // Process exit code
  var stdout = result.stdout // UTF-8 string contents of process.stdout
  var stderr = result.stderr // UTF-8 string contents of process.stderr

  assert.equal(exitCode, 0)
  assert.equal(stdout, 'Hello, thomas!\n')
  assert.equal(stderr, '')
})

// Execute the CLI task
require('./index')

// Kill the task if still running after one second
setTimeout(kill, 1000)

出力が有効でなく、.on('line)イベントを実行していないため、テストに失敗しています。

4

1 に答える 1