Шутка издеваться над методами LocalStorage - PullRequest
0 голосов
/ 19 октября 2018

Я хотел бы смоделировать методы localStorage в шутку для симуляции ошибок.У меня есть локальные методы getter и setter, определенные в utility.js.Я хотел бы, чтобы localStorage.setItem выдавал ошибку при вызове utility.setItem.

//file: utility.js
export default {
  getItem(key) {
    return localStorage.getItem(key);
  },
  setItem(key, value) {
    localStorage.setItem(key, value);
  }
};

В шутку,

test('throw error', () => {
  localStorage.setItem = jest.fn(() => {
    console.log(" called ");
    throw new Error('ERROR');
  });

  utility.setItem('123', 'value');
});

Однако localStorage.setItem mock никогда не вызывается.Я также пытался сделать

window.localStorage.setItem = jest.genMockFunction(()=>{console.log(" Mock Called")});
global.localStorage.setItem = jest.fn(()=>{console.log(" Mock Called")});

Ответы [ 4 ]

0 голосов
/ 21 декабря 2018

jest.spyOn(window.localStorage.__proto__, 'setItem'); работает без необходимости, как указано здесь: https://github.com/facebook/jest/issues/6798#issuecomment-440988627

0 голосов
/ 19 октября 2018

Чтобы получить доступ к тому, что находится в глобальной области действия тестируемого модуля, вам нужно использовать пространство имен global.Поэтому для доступа localStorage используйте global.localStorage:

global.storage = {
  store:{},
  getItem(key)=>this.store[key],
  setItem: (key, value)=> this.store[key] = value
}
0 голосов
/ 19 октября 2018

Это согласуется с тем, что Андреас предложил в ответе, но мне удалось смоделировать его с помощью интерфейса Storage .Я сделал что-то вроде этого,

В шутку,

test('throw error', () => {
  Storage.prototype.setItem = jest.fn(() => {
    console.log(" called "); // <-- was called 
    throw new Error('ERROR');
  });

  utility.setItem('123', 'value');
});

Также это обсуждение PR было полезным.

0 голосов
/ 19 октября 2018

Если вы хотите протестировать функции localStorage, я хотел бы предложить этот хороший пакет npm.

После настройки этого пакета в файле тестовой установки согласно документации, вы можетесделайте это после.

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);
});


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
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...