0.2.1 • Published 2 years ago

@eugenetriguba/mock-cli v0.2.1

Weekly downloads
-
License
ISC
Repository
github
Last release
2 years ago

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

The ISC License

Credits

Terminal Icon by Andrea Mazzini (CC BY 3.0).