When using Angular you are best to write a service which is doing the workfor you to being able to test and mock the localstorage:
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class LocalStorageService {
setItem(key: string, value: any) {
localStorage.setItem(key, value);
}
getItem(key: string): any {
return localStorage.getItem(key);
}
setBool(key: string, value: boolean) {
localStorage.setItem(key, String(value));
}
getBool(key: string): boolean {
return localStorage.getItem(key) === 'true';
}
setObject(key: string, value: object) {
localStorage.setItem(key, JSON.stringify(value));
}
getObject(key: string): object {
return JSON.parse(localStorage.getItem(key));
}
}
jasmine integration test:
import { TestBed } from '@angular/core/testing';
import { LocalStorageService } from './local-storage.service';
describe('LocalStorageService', () => {
let service: LocalStorageService;
beforeEach(() => {
TestBed.configureTestingModule({});
service = TestBed.inject(LocalStorageService);
});
it('should read and write a string', () => {
const key = 'my_key';
const value = 'my_value';
service.setItem(key, value);
expect(service.getItem(key)).toEqual(value);
});
it('should read and write a bool', () => {
const key = 'my_key';
const value = true;
service.setBool(key, value);
expect(service.getBool(key)).toEqual(value);
});
it('should read and write an object', () => {
const key = 'my_key';
const value = {my_property: 'my_value'};
service.setObject(key, value);
expect(service.getObject(key)).toEqual(value);
});
});