spawn-with-mocks
Mock shell commands with JavaScript
Intended for testing shell scripts while mocking specific commands. Make assertions about the input for each command, and/or mock their stdout, stderr, and exit codes.
Example
In this script, we use curl
to make a network request, then grep
to filter by the letter F:
# example.sh curl "<example-url>" | grep F
When testing the script, we decide to mock curl
, but not grep
:
const spawn = spawnPromiseconst assert = const curl = { // The mock will receive the input // that was passed to the shell command assert // Defining the mock output: return code: 0 stdout: 'Frog' 'Shrimp' 'Crab' stderr: '' } const options = mocks: curl
API
spawn (command[, args][, options])
Wrapper for child_process.spawn, with a new option called mocks
. It returns a new ChildProcess.
options.mocks
Each key is a shell command, and the values are functions that should return an Object
, Number
, or String
.
Object
When returning objects, they can have the following properties:
// exit the command with this status code (default: 0) code: Number // pipe this to stdout (default: '') stdout: String // pipe this to stderr (default: '') stderr: String
Number
If a mock returns a number, it will be used as code
stdout
andstderr
will be''
String
If a mock returns a string, it will be used as stdout
code
will be0
andstderr
will be''
options.stdio
type: String|Array
The function also modifies the native stdio option. The last element of stdio will always be 'ipc'
, because the library uses that to message the spawned process. A ChildProcess can only have one IPC channel, so 'ipc'
should not be set by the input options.
spawnPromise (command[, args][, options])
Like spawn
, but it returns a Promise that resolves when the ChildProcess fires the close
event. The resolved value is an object with these properties:
// The process exit code code: Number // The signal that terminated the process signal: String // The stdout from the process stdout: String // The stderr from the process stderr: String
How it Works
Each mock is an executable that's stored in a temporary PATH
directory. Currently, the mocks do not work for all commands (such as builtins). This could be changed in a future version by using shell functions to create the mocks.
See Also
jest-shell-matchers - make assertions about the output from spawn-with-mocks
LICENSE
MIT