mock-path-with-spy-that-returns-x v2.0.0
mock-path-with-spy-that-returns-x
Mocks a given path with a spy that returns either a symbol or something provided by you.
Why?
Because in unit tests, we mock some dependency functions.
And, usually, we like them to return a constant value.
And, usually, we like to assert their calls/args.
And, usually, we require
the test subject multiple times.
This utility fits that pattern.
How?
Example
dep.js
// we will be mocking this file
module.exports = (x) => x.toUpperCase()
index.js
// this module will be our test subject
const dep = require('./dep')
module.exports = (x) => dep(x) + '-foo'
index.test.js
// unit tests here
const assert = require('assert')
const mockPathWithSpy = require('mock-path-with-spy-that-returns-x')
const requireUncached = require('require-uncached')
// set up a mock
const depMocks = mockPathWithSpy(
'./dep', // path to mock
'MOCKED' // mocked function return value
)
// test A
const depMockA = depMocks.next().value // mock
const subjectA = requireUncached('.')
const actualA = subjectA('a')
assert.strictEqual(actualA, 'MOCKED-foo') // `./dep` is mocked
assert.deepStrictEqual(depMockA.spy.args, [['a']]) // spy available
// test B
const depMockB = depMocks.next().value
const subjectB = requireUncached('.')
const actualB = subject('b')
assert.strictEqual((actualB, 'MOCKED-foo')
assert.deepStrictEqual(depMockB.spy.args, [['b']])
API
mockPathWithSpy(path[, constantReturn])
(generator)
path
The path to mock. Will be passed tomock
.constantReturn
(optional)
If provided, the spy will return provided value.
If not provided, the spy will return a symbol that is unique to each mock.
The description of the symbols will bepath
.
Returns an iterator:
On next
, the path
is mocked with a new spy
and an object is returned:
spy
The simple-spy spyspyReturn
The spy’s return valuestop()
Callsmock.stop
on thepath
Caveats
Uses module.parent
So it must always be require
d
directly in the module where it is used.
This may be fixed by using
caller-path
instead of module.parent
,
so please report an issue
if you find that it bothers you.
require
s the mocked module
The path
is require
d
and the exported function’s length is examined,
for the purpose of the mock function
being of the same arity as the mocked function.