Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/clarkbw/jest-localstorage-mock
A module to mock window.localStorage and window.sessionStorage in Jest
https://github.com/clarkbw/jest-localstorage-mock
javascript jest jest-tests localstorage mock react sessionstorage testing
Last synced: 3 days ago
JSON representation
A module to mock window.localStorage and window.sessionStorage in Jest
- Host: GitHub
- URL: https://github.com/clarkbw/jest-localstorage-mock
- Owner: clarkbw
- License: bsd-3-clause
- Created: 2017-05-06T06:17:33.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2024-09-27T09:18:10.000Z (4 months ago)
- Last Synced: 2024-10-30T02:31:24.398Z (3 months ago)
- Topics: javascript, jest, jest-tests, localstorage, mock, react, sessionstorage, testing
- Language: JavaScript
- Homepage:
- Size: 1.2 MB
- Stars: 320
- Watchers: 8
- Forks: 33
- Open Issues: 8
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- License: LICENSE
- Code of conduct: CODE_OF_CONDUCT.md
Awesome Lists containing this project
- awesome-jest - jest-localstorage-mock
README
Use this module with [Jest](https://facebook.github.io/jest/) to run web tests
that rely on `localstorage` and / or `sessionStorage` where you want a working
localStorage API with mocked functions.This module has no runtime dependencies so your project won't pull in additional
module dependencies by using this.[![npm](https://img.shields.io/npm/v/jest-localstorage-mock.svg)](https://www.npmjs.com/package/jest-localstorage-mock)
[![npm](https://img.shields.io/npm/l/jest-localstorage-mock.svg)](https://github.com/clarkbw/jest-localstorage-mock/blob/master/LICENSE)
[![Codecov](https://img.shields.io/codecov/c/github/clarkbw/jest-localstorage-mock.svg)](https://codecov.io/gh/clarkbw/jest-localstorage-mock)
[![Greenkeeper badge](https://badges.greenkeeper.io/clarkbw/jest-localstorage-mock.svg)](https://greenkeeper.io/)
[![Twitter](https://img.shields.io/twitter/url/https/github.com/clarkbw/jest-localstorage-mock.svg?style=social)](https://twitter.com/intent/tweet?text=Wow:&url=%5Bobject%20Object%5D)# Jest 24+
Note that with `jest@24` and above this project potentially duplicating functionality.
## Install
This should only be installed as a development dependency (`devDependencies`) as
it is only designed for testing. The module is transpiled via
[babel](https://github.com/babel/babel) to support the current active Node LTS
version (6.11.3).yarn:
```bash
yarn add --dev jest-localstorage-mock
```npm:
```bash
npm i --save-dev jest-localstorage-mock
```## Setup
The simplest setup is to use the [module](#module) system, you may also choose
to create a [setup file](#setup-file) if needed.### Module
In your `package.json` under the `jest`
[configuration section](https://facebook.github.io/jest/docs/en/configuration.html#content)
create a `setupFiles` array and add `jest-localstorage-mock` to the array. Also, ensure you have *not* enabled [`resetMocks`](https://jestjs.io/docs/en/configuration#resetmocks-boolean).```json
{
"jest": {
"resetMocks": false,
"setupFiles": ["jest-localstorage-mock"]
}
}
```If you already have a `setupFiles` attribute you can also append
`jest-localstorage-mock` to the array.```json
{
"jest": {
"resetMocks": false,
"setupFiles": ["./__setups__/other.js", "jest-localstorage-mock"]
}
}
```### Setup file
Alternatively you can create a new setup file which then requires this module or
add the `require` statement to an existing setup file.`__setups__/localstorage.js`
```js
import 'jest-localstorage-mock';
// or
require('jest-localstorage-mock');
```Add that file to your `setupFiles` array:
```json
"jest": {
"setupFiles": [
"./__setups__/localstorage.js"
]
}
```### In create-react-app
For a [create-react-app](https://github.com/facebookincubator/create-react-app)
project you can replace the
[suggested mock](https://github.com/facebookincubator/create-react-app/tree/master/packages/react-scripts/template#srcsetuptestsjs-1)
with this at the beginning of the existing `src/setupTests.js` file:```js
require('jest-localstorage-mock');
```You must also override some of create-react-app's default jest configuration. You can do so in your `package.json`:
```json
{
"jest": {
"resetMocks": false
}
}
```For more information, see [#125](https://github.com/clarkbw/jest-localstorage-mock/issues/125).
## In tests
By including this in your Jest setup you'll allow tests that expect a
`localStorage` and `sessionStorage` object to continue to run. The module can
also allow you to use the mocks provided to check that your localStorage is
being used as expected.The `__STORE__` attribute of `localStorage.__STORE__` or
`sessionStorage.__STORE__` is made available for you to directly access the
storage object if needed.### Test Examples
Check that your `localStorage` calls were made when they were supposed to.
```js
test('should save to localStorage', () => {
const KEY = 'foo',
VALUE = 'bar';
dispatch(action.update(KEY, VALUE));
expect(localStorage.setItem).toHaveBeenLastCalledWith(KEY, VALUE);
expect(localStorage.__STORE__[KEY]).toBe(VALUE);
expect(Object.keys(localStorage.__STORE__).length).toBe(1);
});
```Check that your `sessionStorage` is empty, examples work with either
`localStorage` or `sessionStorage`.```js
test('should have cleared the sessionStorage', () => {
dispatch(action.reset());
expect(sessionStorage.clear).toHaveBeenCalledTimes(1);
expect(sessionStorage.__STORE__).toEqual({}); // check store values
expect(sessionStorage.length).toBe(0); // or check length
});
```Check that `localStorage` calls were not made when they shouldn't have been.
```js
test('should not have saved to localStorage', () => {
const KEY = 'foo',
VALUE = 'bar';
dispatch(action.notIdempotent(KEY, VALUE));
expect(localStorage.setItem).not.toHaveBeenLastCalledWith(KEY, VALUE);
expect(Object.keys(localStorage.__STORE__).length).toBe(0);
});
```Reset your `localStorage` data and mocks before each test to prevent leaking.
```js
beforeEach(() => {
// to fully reset the state between tests, clear the storage
localStorage.clear();
// and reset all mocks
jest.clearAllMocks();
// clearAllMocks will impact your other mocks too, so you can optionally reset individual mocks instead:
localStorage.setItem.mockClear();
});test('should not impact the next test', () => {
const KEY = 'foo',
VALUE = 'bar';
dispatch(action.update(KEY, VALUE));
expect(localStorage.setItem).toHaveBeenLastCalledWith(KEY, VALUE);
expect(localStorage.__STORE__[KEY]).toBe(VALUE);
expect(Object.keys(localStorage.__STORE__).length).toBe(1);
});test('should not be impacted by the previous test', () => {
const KEY = 'baz',
VALUE = 'zab';
dispatch(action.update(KEY, VALUE));
expect(localStorage.setItem).toHaveBeenLastCalledWith(KEY, VALUE);
expect(localStorage.__STORE__[KEY]).toBe(VALUE);
expect(Object.keys(localStorage.__STORE__).length).toBe(1);
});
```See the [contributing guide](./CONTRIBUTING.md) for details on how you can
contribute.