I keep getting "localStorage is not defined" in Jest tests which makes sense but what are my options? Hitting brick walls.
30 Answers
Great solution from @chiedo
However, we use ES2015 syntax and I felt it was a little cleaner to write it this way.
class LocalStorageMock {
constructor() {
this.store = {};
}
clear() {
this.store = {};
}
getItem(key) {
return this.store[key] || null;
}
setItem(key, value) {
this.store[key] = String(value);
}
removeItem(key) {
delete this.store[key];
}
}
global.localStorage = new LocalStorageMock;
-
12Should probably do `value + ''` in the setter to handle null and undefined values correctly – Andrew M. Sep 11 '17 at 15:42
-
I think that latest jest was just using that `|| null` that's why my test was failing, because in my test I was using `not.toBeDefined()`. @Chiedo solution make it work again – jcubic Sep 07 '18 at 16:56
-
I think this is technically a stub :) see here for the mocked version: https://stackoverflow.com/questions/32911630/how-do-i-deal-with-localstorage-in-jest-tests/54239779#answer-54239779 – TigerBear Jan 17 '19 at 19:48
-
28**Update 2021**: For people using Jest@24 and above, localStorage is mocked automatically. – Niket Pathak Feb 24 '21 at 21:59
-
9hi @NiketPathak, do you have a source for this? I couldn't find anything about it in the release notes for version 24 or the documentation. – AvantiC Mar 04 '21 at 13:59
-
4I am using Jest@24 and it is not available. I had to mock per the solution. @NiketPathak – CodeSammich Apr 22 '21 at 19:02
-
@NiketPathak I'm using Jest@27 and it's not mocked automatically :/ – Barry Michael Doyle Jan 20 '22 at 13:44
-
3**Update 2022**: Actually, I think @NiketPathak meant jest@22 and above, since [that version uses jsdom@11](https://github.com/facebook/jest/blob/v22.0.0/packages/jest-environment-jsdom/package.json#L13) and [support for localStorage and sessionStorage was added on jsdom 11.12.0](https://github.com/jsdom/jsdom/blob/master/Changelog.md#11120) – Sam May 26 '22 at 18:57
-
Nice, should use ?? instead of || so empty string is handled correctly. – Mattias Martens Aug 11 '22 at 19:19
-
1
Figured it out with help from this: https://groups.google.com/forum/#!topic/jestjs/9EPhuNWVYTg
Setup a file with the following contents:
var localStorageMock = (function() {
var store = {};
return {
getItem: function(key) {
return store[key];
},
setItem: function(key, value) {
store[key] = value.toString();
},
clear: function() {
store = {};
},
removeItem: function(key) {
delete store[key];
}
};
})();
Object.defineProperty(window, 'localStorage', { value: localStorageMock });
Then you add the following line to your package.json under your Jest configs
"setupTestFrameworkScriptFile":"PATH_TO_YOUR_FILE",
-
6Apparently with one of the updates the name of this parameter changed and now it is called "setupTestFrameworkScriptFile" – Grzegorz Pawlik Dec 09 '16 at 12:08
-
2`"setupFiles": [...]` works as well. With the array option, allows separating mocks into separate files. E.g.: `"setupFiles": ["
/__mocks__/localStorageMock.js"]` – Stiggler Mar 23 '17 at 21:07 -
5The return value of `getItem` differs slightly to what would be returned by a browser if the no data is set against a specific key. calling `getItem("foo")` when its not set will for example return `null` in a browser, but `undefined` by this mock - this was causing one of my tests to fail. Simple solution for me was to return `store[key] || null` in the `getItem` function – Ben Broadley Mar 30 '17 at 19:39
-
2this doesn't work if you do something like `localStorage['test'] = '123'; localStorage.getItem('test')` – rob Oct 25 '17 at 20:58
-
What is the IIFE for in this example? Any reason I can't just do this: `Object.defineProperty(window, 'localStorage', { value: { store: {}, getItem: function(key) { return this.store[key] || null; }, setItem: function(key, value) { this.store[key] = value.toString(); }, clear: function() { this.store = {}; } } });` – Nick Apr 30 '18 at 13:08
-
3I am getting the following error - jest.fn() value must be a mock function or spy. Any ideas? – Paul Fitzgerald Dec 10 '18 at 16:53
-
If you're using TS and get errors, you can give `store` a type annotation, i.e. `const store: Record
= {};` – AshNaz87 Feb 13 '23 at 13:33
Answer:
Currently (Jul '22) localStorage can not be mocked or spied on by jest as you usually would, and as outlined in the create-react-app docs. This is due to changes made in jsdom. You can read about it in the jest and jsdom issue trackers.
As a workaround, you can spy on the prototype instead:
// does not work:
jest.spyOn(localStorage, "setItem");
localStorage.setItem = jest.fn();
// either of these lines will work, different syntax that does the same thing:
jest.spyOn(Storage.prototype, 'setItem');
Storage.prototype.setItem = jest.fn();
// assertions as usual:
expect(localStorage.setItem).toHaveBeenCalled();
A note on spying on the prototype:
Spying on an instance gives you the ability to observe and mock behaviour for a specific object.
Spying on the prototype, on the other hand, will observe/manipulate every instance of that class all at once. Unless you have a special usecase, this is probably not what you want.
While in many cases when dealing with localStorage
, using the prototype is acceptable, @onlywei pointed out an important caveat:
This strategy will not allow you to differentiate between
localStorage
andsessionStorage
, as both are instances ofStorage
and inherit from the Storage prototype.
For implementations that deal with both concepts, you want to consider your specific situation and implications.

- 2,147
- 1
- 13
- 28
-
2Actually it works for me just with the spyOn, no need to override setItem function `jest.spyOn(window.localStorage.__proto__, 'setItem');` – Yohan Dahmani Mar 19 '20 at 10:26
-
-
-
-
The second line of « works: » (window.localStorage[...].setItem=jest.fn()) wasn’t necessary for me to make it work. – Yohan Dahmani Mar 24 '20 at 10:11
-
2Ah yes. I was saying you can use either the first line, or the second line. They are alternatives that do the same thing. Whatever is your personal preference :) Sorry about the confusion. – Bastian Stein Mar 24 '20 at 10:15
-
8FWIW, eslint now says that obj.__proto__ is deprecated and its best to use Object.getPrototypeOf(obj) instead. That also seems to work here. – Ken Pronovici Jun 26 '20 at 00:36
-
2This strategy will not allow you to differentiate between localStorage and sessionStorage, as both are instances of Storage and inherit from the Storage prototype. – onlywei Mar 08 '23 at 21:22
If using create-react-app, there is a simpler and straightforward solution explained in the documentation.
Create src/setupTests.js
and put this in it :
const localStorageMock = {
getItem: jest.fn(),
setItem: jest.fn(),
clear: jest.fn()
};
global.localStorage = localStorageMock;
Tom Mertz contribution in a comment below :
You can then test that your localStorageMock's functions are used by doing something like
expect(localStorage.getItem).toBeCalledWith('token')
// or
expect(localStorage.getItem.mock.calls.length).toBe(1)
inside of your tests if you wanted to make sure it was called. Check out https://facebook.github.io/jest/docs/en/mock-functions.html

- 4,270
- 4
- 40
- 65
-
Hi c4k! Could you please give an example how you would use that in your tests? – Dimo Dec 27 '17 at 10:05
-
What do you mean ? You don't have to initialize anything in your tests, it just mocks automatically the `localStorage` you use in your code. (if you use `create-react-app` and all the automatic scripts it provides naturally) – c4k Dec 28 '17 at 10:58
-
You can then test that your localStorageMock's functions are used by doing something like `expect(localStorage.getItem).toBeCalledWith('token')` or `expect(localStorage.getItem.mock.calls.length).toBe(1)` inside of your tests if you wanted to make sure it was called. Check out https://facebook.github.io/jest/docs/en/mock-functions.html – Tom Mertz Jun 06 '18 at 17:35
-
18for this I am getting an error - jest.fn() value must be a mock function or spy. Any ideas? – Paul Fitzgerald Dec 10 '18 at 16:53
-
3Won't this cause problems if you have multiple tests that use `localStorage`? Wouldn't you want to reset the spies after each test to prevent "spillover" into other tests? – Brandon Sturgeon Jan 29 '19 at 17:16
Unfortunately, the solutions that I've found here didn't work for me.
So I was looking at Jest GitHub issues and found this thread
The most upvoted solutions were these ones:
const spy = jest.spyOn(Storage.prototype, 'setItem');
// or
Storage.prototype.getItem = jest.fn(() => 'bla');

- 1,568
- 15
- 22
-
1My tests don't have `window` or `Storage` defined either. Maybe it's the older version of Jest I'm using. – Antrikshy May 20 '20 at 23:24
-
or you just take a mock package like this:
https://www.npmjs.com/package/jest-localstorage-mock
it handles not only the storage functionality but also allows you test if the store was actually called.

- 643
- 1
- 6
- 10
A better alternative which handles undefined
values (it doesn't have toString()
) and returns null
if value doesn't exist. Tested this with react
v15, redux
and redux-auth-wrapper
class LocalStorageMock {
constructor() {
this.store = {}
}
clear() {
this.store = {}
}
getItem(key) {
return this.store[key] || null
}
setItem(key, value) {
this.store[key] = value
}
removeItem(key) {
delete this.store[key]
}
}
global.localStorage = new LocalStorageMock

- 5,443
- 2
- 52
- 50
-
Thanks to Alexis Tyler for the idea to add `removeItem`: https://developer.mozilla.org/en-US/docs/Web/API/Storage/removeItem – Dmytro May 25 '17 at 15:49
-
Believe null and undefined need to result in "null" and "undefined" (literal strings) – Andrew M. Sep 11 '17 at 15:44
If you are looking for a mock and not a stub, here is the solution I use:
export const localStorageMock = {
getItem: jest.fn().mockImplementation(key => localStorageItems[key]),
setItem: jest.fn().mockImplementation((key, value) => {
localStorageItems[key] = value;
}),
clear: jest.fn().mockImplementation(() => {
localStorageItems = {};
}),
removeItem: jest.fn().mockImplementation((key) => {
localStorageItems[key] = undefined;
}),
};
export let localStorageItems = {}; // eslint-disable-line import/no-mutable-exports
I export the storage items for easy initialization. I.E. I can easily set it to an object
In the newer versions of Jest + JSDom it is not possible to set this, but the localstorage is already available and you can spy on it it like so:
const setItemSpy = jest.spyOn(Object.getPrototypeOf(window.localStorage), 'setItem');

- 2,479
- 1
- 21
- 24
For Jest
, React
& TypeScript
users:
I created a mockLocalStorage.ts
export const mockLocalStorage = () => {
const setItemMock = jest.fn();
const getItemMock = jest.fn();
beforeEach(() => {
Storage.prototype.setItem = setItemMock;
Storage.prototype.getItem = getItemMock;
});
afterEach(() => {
setItemMock.mockRestore();
getItemMock.mockRestore();
});
return { setItemMock, getItemMock };
};
My component:
export const Component = () => {
const foo = localStorage.getItem('foo')
localStorage.setItem('bar', 'true')
return <h1>{foo}</h1>
}
then in my tests I use it like so:
import React from 'react';
import { mockLocalStorage } from '../../test-utils';
import { Component } from './Component';
const { getItemMock, setItemMock } = mockLocalStorage();
it('fetches something from localStorage', () => {
getItemMock.mockReturnValue('bar');
render(<Component />);
expect(getItemMock).toHaveBeenCalled();
expect(getByText(/bar/i)).toBeInTheDocument()
});
it('expects something to be set in localStorage' () => {
const value = "true"
const key = "bar"
render(<Component />);
expect(setItemMock).toHaveBeenCalledWith(key, value);
}

- 3,105
- 1
- 25
- 35
-
1How would I use `setItemMock` in this solution? I am kinda confused and also new to testing/testing with jest. – vveil May 18 '21 at 07:21
-
1
-
I found this solution from github
var localStorageMock = (function() {
var store = {};
return {
getItem: function(key) {
return store[key] || null;
},
setItem: function(key, value) {
store[key] = value.toString();
},
clear: function() {
store = {};
}
};
})();
Object.defineProperty(window, 'localStorage', {
value: localStorageMock
});
You can insert this code in your setupTests and it should work fine.
I tested it in a project with typesctipt.

- 139
- 1
- 3
-
for me Object.defineProperty made the trick. Direct object assignment did not work. Thanks! – Vicens Fayos Dec 08 '19 at 13:33
-
-
you should use mock data instead of services for testing. In unit tests you should test a single functionality. – Carlos Huamani Sep 04 '20 at 23:52
-
A bit more elegant solution using TypeScript and Jest.
interface Spies {
[key: string]: jest.SpyInstance
}
describe('→ Local storage', () => {
const spies: Spies = {}
beforeEach(() => {
['setItem', 'getItem', 'clear'].forEach((fn: string) => {
const mock = jest.fn(localStorage[fn])
spies[fn] = jest.spyOn(Storage.prototype, fn).mockImplementation(mock)
})
})
afterEach(() => {
Object.keys(spies).forEach((key: string) => spies[key].mockRestore())
})
test('→ setItem ...', async () => {
localStorage.setItem( 'foo', 'bar' )
expect(localStorage.getItem('foo')).toEqual('bar')
expect(spies.setItem).toHaveBeenCalledTimes(1)
})
})

- 175
- 4
- 11

- 5,209
- 3
- 26
- 29
An update for 2022.
Jest@24+ has ability to mock local storage automatically. However, the dependency needed no longer ships with it by default.
npm i -D jest-environment-jsdom
You also need to change your Jest test mode:
// jest.config.cjs
module.exports = {
...
testEnvironment: "jsdom",
...
};
Now localStorage will already be mocked for you.
Example:
// myStore.js
const saveLocally = (key, value) => {
localStorage.setItem(key, value)
};
Test:
// myStore.spec.ts
import { saveLocally } from "./myStore.js"
it("saves key-value pair", () => {
let key = "myKey";
let value = "myValue";
expect(localStorage.getItem(key)).toBe(null);
saveLocally(key, value);
expect(localStorage.getItem(key)).toBe(value);
};

- 471
- 7
- 18
You can use this approach, to avoid mocking.
Storage.prototype.getItem = jest.fn(() => expectedPayload);

- 4,774
- 10
- 51
- 81
-
how to setup some service to load the data from localStorage ? Here is my question https://stackoverflow.com/questions/63716411/setup-localstorage-for-testing-react-with-jest – Darmawan Z. Sep 03 '20 at 04:54
Object.defineProperty(window, "localStorage", {
value: {
getItem: jest.fn(),
setItem: jest.fn(),
removeItem: jest.fn(),
},
});
or
jest.spyOn(Object.getPrototypeOf(localStorage), "getItem");
jest.spyOn(Object.getPrototypeOf(localStorage), "setItem");

- 246
- 4
- 6
2021, typescript
class LocalStorageMock {
store: { [k: string]: string };
length: number;
constructor() {
this.store = {};
this.length = 0;
}
/**
* @see https://developer.mozilla.org/en-US/docs/Web/API/Storage/key
* @returns
*/
key = (idx: number): string => {
const values = Object.values(this.store);
return values[idx];
};
clear() {
this.store = {};
}
getItem(key: string) {
return this.store[key] || null;
}
setItem(key: string, value: string) {
this.store[key] = String(value);
}
removeItem(key: string) {
delete this.store[key];
}
}
export default LocalStorageMock;
you can then use it with
global.localStorage = new LocalStorageMock();
As @ck4 suggested documentation has clear explanation for using localStorage
in jest. However the mock functions were failing to execute any of the localStorage
methods.
Below is the detailed example of my react component which make uses of abstract methods for writing and reading data,
//file: storage.js
const key = 'ABC';
export function readFromStore (){
return JSON.parse(localStorage.getItem(key));
}
export function saveToStore (value) {
localStorage.setItem(key, JSON.stringify(value));
}
export default { readFromStore, saveToStore };
Error:
TypeError: _setupLocalStorage2.default.setItem is not a function
Fix:
Add below mock function for jest (path: .jest/mocks/setUpStore.js
)
let mockStorage = {};
module.exports = window.localStorage = {
setItem: (key, val) => Object.assign(mockStorage, {[key]: val}),
getItem: (key) => mockStorage[key],
clear: () => mockStorage = {}
};
Snippet is referenced from here

- 4,479
- 18
- 52
- 93
describe('getToken', () => {
const Auth = new AuthService();
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6Ik1yIEpvc2VwaCIsImlkIjoiNWQwYjk1Mzg2NTVhOTQ0ZjA0NjE5ZTA5IiwiZW1haWwiOiJ0cmV2X2pvc0Bob3RtYWlsLmNvbSIsInByb2ZpbGVVc2VybmFtZSI6Ii9tcmpvc2VwaCIsInByb2ZpbGVJbWFnZSI6Ii9Eb3Nlbi10LUdpci1sb29rLWN1dGUtbnVrZWNhdDMxNnMtMzExNzAwNDYtMTI4MC04MDAuanBnIiwiaWF0IjoxNTYyMzE4NDA0LCJleHAiOjE1OTM4NzYwMDR9.YwU15SqHMh1nO51eSa0YsOK-YLlaCx6ijceOKhZfQZc';
beforeEach(() => {
global.localStorage = jest.fn().mockImplementation(() => {
return {
getItem: jest.fn().mockReturnValue(token)
}
});
});
it('should get the token from localStorage', () => {
const result = Auth.getToken();
expect(result).toEqual(token);
});
});
Create a mock and add it to the global
object

- 27,060
- 21
- 118
- 148

- 31
- 2
To do the same in the Typescript, do the following:
Setup a file with the following contents:
let localStorageMock = (function() {
let store = new Map()
return {
getItem(key: string):string {
return store.get(key);
},
setItem: function(key: string, value: string) {
store.set(key, value);
},
clear: function() {
store = new Map();
},
removeItem: function(key: string) {
store.delete(key)
}
};
})();
Object.defineProperty(window, 'localStorage', { value: localStorageMock });
Then you add the following line to your package.json under your Jest configs
"setupTestFrameworkScriptFile":"PATH_TO_YOUR_FILE",
Or you import this file in your test case where you want to mock the localstorage.

- 715
- 2
- 8
- 18
As mentioned in a comment by Niket Pathak,
starting jest@24 / jsdom@11.12.0 and above, localStorage
is mocked automatically.

- 17,781
- 22
- 77
- 111
-
-
1this! yes, I didn't have to do anything at all and I could just spyOn localStorage, just two minutes ago. – schlingel Mar 11 '22 at 11:01
-
At least as of now, localStorage can be spied on easily on your jest tests, for example:
const spyRemoveItem = jest.spyOn(window.localStorage, 'removeItem')
And that's it. You can use your spy as you are used to.

- 1,514
- 2
- 15
- 24
This worked for me and just one code line
const setItem = jest.spyOn(Object.getPrototypeOf(localStorage), 'setItem');

- 651
- 5
- 10
Riffed off some other answers here to solve it for a project with Typescript. I created a LocalStorageMock like this:
export class LocalStorageMock {
private store = {}
clear() {
this.store = {}
}
getItem(key: string) {
return this.store[key] || null
}
setItem(key: string, value: string) {
this.store[key] = value
}
removeItem(key: string) {
delete this.store[key]
}
}
Then I created a LocalStorageWrapper class that I use for all access to local storage in the app instead of directly accessing the global local storage variable. Made it easy to set the mock in the wrapper for tests.

- 17,174
- 28
- 113
- 161
The following solution is compatible for testing with stricter TypeScript, ESLint, TSLint, and Prettier config: { "proseWrap": "always", "semi": false, "singleQuote": true, "trailingComma": "es5" }
:
class LocalStorageMock {
public store: {
[key: string]: string
}
constructor() {
this.store = {}
}
public clear() {
this.store = {}
}
public getItem(key: string) {
return this.store[key] || undefined
}
public setItem(key: string, value: string) {
this.store[key] = value.toString()
}
public removeItem(key: string) {
delete this.store[key]
}
}
/* tslint:disable-next-line:no-any */
;(global as any).localStorage = new LocalStorageMock()
HT/ https://stackoverflow.com/a/51583401/101290 for how to update global.localStorage

- 33,433
- 13
- 94
- 101
There is no need to mock localStorage - just use the jsdom environment so that your tests run in browser-like conditions.
In your jest.config.js,
module.exports = {
// ...
testEnvironment: "jsdom"
}

- 8,749
- 4
- 47
- 57
none of the answers above worked for me. So after some digging this is what I got to work. Credit goes to a few sources and other answers as well.
- https://www.codeblocq.com/2021/01/Jest-Mock-Local-Storage/
- https://github.com/facebook/jest/issues/6798#issuecomment-440988627
- https://gist.github.com/mayank23/7b994385eb030f1efb7075c4f1f6ac4c
- https://github.com/facebook/jest/issues/6798#issuecomment-514266034
My full gist: https://gist.github.com/ar-to/01fa07f2c03e7c1b2cfe6b8c612d4c6b
/**
* Build Local Storage object
* @see https://www.codeblocq.com/2021/01/Jest-Mock-Local-Storage/ for source
* @see https://stackoverflow.com/a/32911774/9270352 for source
* @returns
*/
export const fakeLocalStorage = () => {
let store: { [key: string]: string } = {}
return {
getItem: function (key: string) {
return store[key] || null
},
setItem: function (key: string, value: string) {
store[key] = value.toString()
},
removeItem: function (key: string) {
delete store[key]
},
clear: function () {
store = {}
},
}
}
/**
* Mock window properties for testing
* @see https://gist.github.com/mayank23/7b994385eb030f1efb7075c4f1f6ac4c for source
* @see https://github.com/facebook/jest/issues/6798#issuecomment-514266034 for sample implementation
* @see https://developer.mozilla.org/en-US/docs/Web/API/Window#properties for window properties
* @param { string } property window property string but set to any due to some warnings
* @param { Object } value for property
*
* @example
*
* const testLS = {
* id: 5,
* name: 'My Test',
* }
* mockWindowProperty('localStorage', fakeLocalStorage())
* window.localStorage.setItem('currentPage', JSON.stringify(testLS))
*
*/
const mockWindowProperty = (property: string | any, value: any) => {
const { [property]: originalProperty } = window
delete window[property]
beforeAll(() => {
Object.defineProperty(window, property, {
configurable: true,
writable: true,
value,
})
})
afterAll(() => {
window[property] = originalProperty
})
}
export default mockWindowProperty

- 590
- 7
- 11
In my case, I needed to set the localStorage value before I check it.
So what I did is
const data = { .......}
const setLocalStorageValue = (name: string, value: any) => {
localStorage.setItem(name, JSON.stringify(value))
}
describe('Check X class', () => {
setLocalStorageValue('Xname', data)
const xClass= new XClass()
console.log(xClass.initiate()) ; // it will work
})

- 175
- 2
- 5
2022 December: Nx 14 with Angular 14 Jest.
We have an test-setup.ts
file in every app and libs folder. We setting local storage mock globaly.
import 'jest-preset-angular/setup-jest';
Storage.prototype.getItem = jest.fn();
Storage.prototype.setItem = jest.fn();
Storage.prototype.removeItem = jest.fn();
Then localStorage.service.spec.ts
file looking like this:
import { LocalStorageService } from './localstorage.service';
describe('LocalStorageService', () => {
let localStorageService: LocalStorageService;
beforeEach(() => {
localStorageService = new LocalStorageService();
});
it('should set "identityKey" in localStorage', async () => {
localStorageService.saveData('identityKey', '99');
expect(window.localStorage.setItem).toHaveBeenCalled();
expect(window.localStorage.setItem).toHaveBeenCalledWith('identityKey', '99');
expect(window.localStorage.setItem).toHaveBeenCalledTimes(1);
});
it('should get "identityKey" from localStorage', async () => {
localStorageService.getData('identityKey');
expect(window.localStorage.getItem).toHaveBeenCalled();
expect(window.localStorage.getItem).toHaveBeenCalledWith('identityKey');
expect(window.localStorage.getItem).toHaveBeenCalledTimes(1);
});
it('should remove "identityKey" from localStorage', async () => {
localStorageService.removeData('identityKey');
expect(window.localStorage.removeItem).toHaveBeenCalled();
expect(window.localStorage.removeItem).toHaveBeenCalledWith('identityKey');
expect(window.localStorage.removeItem).toHaveBeenCalledTimes(1);
});
});
P.S. Sorry for bad indentation, this SatckOverflow window s*cks.

- 193
- 3
- 8
First: I created a file named localStorage.ts(localStorage.js)
class LocalStorageMock {
store: Store;
length: number;
constructor() {
this.store = {};
this.length = 0;
}
key(n: number): any {
if (typeof n === 'undefined') {
throw new Error(
"Uncaught TypeError: Failed to execute 'key' on 'Storage': 1 argument required, but only 0 present."
);
}
if (n >= Object.keys(this.store).length) {
return null;
}
return Object.keys(this.store)[n];
}
getItem(key: string): Store | null {
if (!Object.keys(this.store).includes(key)) {
return null;
}
return this.store[key];
}
setItem(key: string, value: any): undefined {
if (typeof key === 'undefined' && typeof value === 'undefined') {
throw new Error(
"Uncaught TypeError: Failed to execute 'setItem' on 'Storage': 2 arguments required, but only 0 present."
);
}
if (typeof value === 'undefined') {
throw new Error(
"Uncaught TypeError: Failed to execute 'setItem' on 'Storage': 2 arguments required, but only 1 present."
);
}
if (!key) return undefined;
this.store[key] = value.toString() || '';
this.length = Object.keys(this.store).length;
return undefined;
}
removeItem(key: string): undefined {
if (typeof key === 'undefined') {
throw new Error(
"Uncaught TypeError: Failed to execute 'removeItem' on 'Storage': 1 argument required, but only 0 present."
);
}
delete this.store[key];
this.length = Object.keys(this.store).length;
return undefined;
}
clear(): undefined {
this.store = {};
this.length = 0;
return undefined;
}
}
export const getLocalStorageMock = (): any => {
return new LocalStorageMock();
};
global.localStorage = new LocalStorageMock();
Then create a test file named session.test.ts(session.test.js)
import { getLocalStorageMock } from '../localstorage';
describe('session storage', () => {
let localStorage;
beforeEach(() => {
localStorage = getLocalStorageMock();
});
describe('getItem', () => {
it('should return null if the item is undefined', () => {
expect(localStorage.getItem('item')).toBeNull();
});
it("should return '' instead of null", () => {
localStorage.setItem('item', '');
expect(localStorage.getItem('item')).toBe('');
});
it('should return navid', () => {
localStorage.setItem('item', 'navid');
expect(localStorage.getItem('item')).toBe('navid');
});
});
});

- 195
- 2
- 5
As of 2023 and jest 29, you just have to add the jest-environment-jsdom package via
npm install --save-dev jest-environment-jsdom
and activate it in package.json
via
"jest": { "testEnvironment": "jsdom"}
Now you can use window.localStorage.setItem()
and window.localStorage.getItem()
etc.

- 1
- 1
This worked for me,
delete global.localStorage;
global.localStorage = {
getItem: () =>
}

- 13
- 1
- 6