localStorage 가 제대로 작동하는지는 test 할 필요는 없다고 생각했다.
local Storage 를 호출하는 함수를 별도로 생성한 후 해당 함수에서 parameter 를 전달하는 식으로 작성했다.
// sotrage.js
export const getItem = (key) => localStorage.getItem(key);
export const setItem = (key, value) => localStorage.setItem(key, value);
export const removeItem = (key) => localStorage.removeItem(key);
위의 함수들의 역할은 단순히 데이터를 전달하는 역할만 수행하므로 test 도 localStorage 에 데이터를 제대로 전달하는 지만 확인하면 된다고 생각했다.
때문에 jest.spyOn() 으로 localStorage 안의 메서드의 call 을 추적하는 것을 test 에 이용하고자 하였다.
Creates a mock function similar to jest.fn but also tracks calls to object[methodName]
Note: By default, jest.spyOn also calls the spied method. This is different behavior from most other test libraries.
@example
const video = require('./video');
test('plays video', () => {
const spy = jest.spyOn(video, 'play');
const isPlaying = video.play();
expect(spy).toHaveBeenCalled();
expect(isPlaying).toBe(true);
spy.mockReset();
spy.mockRestore();
});
import { setItem, getItem, removeItem } from './storage';
describe('localStorage', () => {
const mockSetItem = jest.spyOn(Storage.prototype, 'setItem');
const mockGetItem = jest.spyOn(Storage.prototype, 'getItem');
const mockRemoveItem = jest.spyOn(Storage.prototype, 'removeItem');
beforeEach(() => {
jest.clearAllMocks();
});
it('sets item', () => {
setItem('accessToken', '1234');
expect(mockSetItem).toHaveBeenCalledWith('accessToken', '1234');
});
it('gets item', () => {
getItem('accessToken');
expect(mockGetItem).toHaveBeenCalledWith('accessToken');
});
it('removes item', () => {
removeItem('accessToken');
expect(mockRemoveItem).toHaveBeenCalledWith('accessToken');
});
});