@eugenetriguba/mock-cli
v0.2.1
Published
A Node.js library for CLI testing utilties
Downloads
4
Readme
Mock CLI is a Node.js library for testing CLI applications. With it, we can easily mock out write calls to stdout and stderr for a function and check the results afterwards.
➤ Installation
$ npm install --save-dev @eugenetriguba/mock-cli
➤ Usage
To use mock-cli
, we want to import in the MockProcess
class.
This class allows us to mock out stdin, stdout, stderr, and any exit
calls. When we capture
, those process functions are replaced with
our own and when we release
, they're restored back to their originals.
const { MockProcess } = require('@eugenetriguba/mock-cli');
An an example, let's say we're writing a test with mocha
and chai
.
We have a sayHiTo
function that does some outputting to stdout, stderr,
and exits. It'd normally be difficult to unit test this because when we
get to this test, it'd produce a bunch of output that we don't have access
to and exit out of our tests!
function sayHiTo(name) {
console.log(`Hi, ${name}!`);
console.error('about to exit, oh no');
process.exit(1);
}
Instead, we can use a MockProcess
to wrap
those out at runtime with mock versions that we
can check on later.
const { it } = require('mocha');
const { expect } = require('chai');
it('should have the correct output', () => {
const mp = new MockProcess();
mp.capture();
sayHiTo('Eugene');
mp.release();
expect(mp.stdout).to.equal(['Hi, Eugene!\n']);
expect(mp.stdin).to.be.empty;
expect(mp.stderr).to.equal(['about to exit, oh no\n']);
expect(mp.result).to.be.undefined;
expect(mp.exitCode).to.equal(1);
});
While calling capture
and release
on the MockProcess
directly is the most flexible, it can feel verbose when all
you want to do is call one function. For that, you can use wrap
to wrap a function call with a MockProcess
. Instead of retrieving
properties on the MockProcess
, wrap
is a static method that
returns back a MockProcessResult
object.
it('should have the correct output using `wrap`', () => {
let result = MockProcess.wrap(sayHiTo, 'Eugene');
expect(mp.stdout).to.equal(['Hi, Eugene!\n']);
expect(mp.stdin).to.be.empty;
expect(mp.stderr).to.equal(['about to exit, oh no\n']);
expect(mp.result).to.be.undefined;
expect(mp.exitCode).to.equal(1);
});
License
Credits
Terminal Icon by Andrea Mazzini (CC BY 3.0).