Skip to content
This repository has been archived by the owner on Apr 1, 2019. It is now read-only.

mightyiam/mock-path-with-simple-spy

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

35 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Build Status Standard - JavaScript Style Guide

mock-path-with-simple-spy

Mocks a given path with a simple spy that returns either a constant 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 mockPathWithSimpleSpy = require('mock-path-with-simple-spy')
const requireUncached = require('require-uncached')

// set up a mock
const depMocks = mockPathWithSimpleSpy(
  './dep', // path to mock
  'MOCKED' // mocked function return value
)

// test A
const depSpyA = depMocks.next().value // mock
const subjectA = requireUncached('.')
const actualA = subjectA('a')
assert.strictEqual(actualA, 'MOCKED-foo') // `./dep` is mocked
assert.deepStrictEqual(depSpyA.args, [['a']]) // spy available

// test B
const depSpyB = depMocks.next().value
const subjectB = requireUncached('.')
const actualB = subject('b')
assert.strictEqual((actualB, 'MOCKED-foo')
assert.deepStrictEqual(depSpyB.args, [['b']])

API

mockPathWithSimpleSpy(path[, spyReturn]) (not a generator function)

  • path
    The path to mock. Will be passed to mock.
  • spyReturn (optional)
    If provided, all spies return provided value.
    If not provided, all spies share the same return value. A symbol with path as its description.

Returns an iterator, with the following properties:

  • next()
    On next, the path is mocked with a new simple-spy and the spy is returned.
  • spyReturn
    The spy’s return value
  • stop()
    Calls mock.stop on the path

Caveats

Uses module.parent

So it must always be required 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.

requires the mocked module

The path is required and the exported function’s length is examined, for the purpose of the mock function being of the same arity as the mocked function.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

No packages published