jest-nock-fixtures
jest-nock-fixtures is a wrapper for a jest testing environment. It uses nock
to record and playback requests during test runs. It is heavily inspired by https://github.com/nock/nock#nock-back
Install
npm install @nerdwallet/jest-nock-fixtures
Setup and usage
Configure jest
to setup this wrapper before the tests in each test file are executed. In jest@24
, this can be achieved by configuring setupFilesAfterEnv
(https://jestjs.io/docs/en/configuration#setupfilesafterenv-array)
Create a file to import and activate @nerdwallet/jest-nock-fixtures
, in this example named setupAfterEvvJestNockFixtures.js
activating the test wrapper
const createJestNockFixturesTestWrapper = require('@nerdwallet/jest-nock-fixtures');
createJestNockFixturesTestWrapper();
optionally, the error message that is thrown in lockdown
mode can be configured. This allows you to hint at ways to fix that might be specific to the repo @nerdwallet/jest-nock-fixtures
is used in, ex:
const createJestNockFixturesTestWrapper = require('@nerdwallet/jest-nock-fixtures');
createJestNockFixturesTestWrapper({
unmatchedErrorMessage: (reqs, { fixtureFilepath }) =>
`unmatched requests not allowed (found ${
reqs.length
}).\n\nRun \`npm run test:record\` to update fixtures, and try again.`
});
Configure Jest
then configure jest to activate @nerdwallet/jest-nock-fixtures
and wrap each test file in nock fixture recording behavior
{
setupFilesAfterEnv: ['<rootDir>/setupAfterEvvJestNockFixtures.js'],
watchPathIgnorePatterns: ['__nocks__'],
watchPlugins: ['@nerdwallet/jest-nock-fixtures/JestWatchPlugin']
}
Modes
Available modes:
dryrun
: The default, use recorded nocks, allow new http calls, doesn't record anything, useful for writing new testsrecord
: record new nockslockdown
: use recorded nocks, disables all http calls even when not nocked, doesn't recordwild
: all requests go out to the internet, don't replay anything, don't record anything
@nerdwallet/jest-nock-fixtures
reads process.env.JEST_NOCK_FIXTURES_MODE
to control its behavior, allowing script aliases to be created, for example:
"scripts": {
"jest": "jest --coverage",
"test": "npm run jest --",
"test:wild": "JEST_NOCK_FIXTURES_MODE=wild npm run test --",
"test:record": "JEST_NOCK_FIXTURES_MODE=record npm run test --",
"test:lockdown": "JEST_NOCK_FIXTURES_MODE=lockdown npm run test --"
},
lockdown
mode is always used in CI environments (e.g. process.env.CI === true
).
An example workflow:
- develop some code and write some tests. code in question makes external network requests
- record all the requests that happen during local test runs
- playback those recordings during CI test runs to ensure consistency
npm run test -- --watch
npm run test:record
Log levels
By default, minimal logs will be printed. To increase the verbosity of the logs, set JEST_NOCK_FIXTURES_VERBOSE
when running tests. For example:
JEST_NOCK_FIXTURES_VERBOSE=1 npm run test
Developing
Main commands:
yarn install
: Install all dependenciesyarn test
: Run unit tests and generate coverage reports
Other commands you might care about:
yarn lint
: Run lintyarn format
: Automatically fix code issues
Releasing a new version
- Update the version in
package.json
. Take care to follow semantic versioning. - Update
CHANGELOG.md
to reflect the changes in the new version. - Push both of the above changes to the
master
branch. - Create a new release in the GitHub CI. GitHub Actions will automatically publish the new version to npm.