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)
イベントを実行していないため、テストに失敗しています。