Шутка: Тестирование window.location.reload - PullRequest
14 голосов
/ 16 апреля 2019

Как мне написать тест, который гарантирует, что метод reloadFn действительно перезагрузит окно?Я нашел этот ресурс , но мне неясно, как ожидать перезагрузки окна при написании теста, когда перезагрузка этого окна происходит в данной функции.Спасибо за помощь!

const reloadFn = () => {
  window.location.reload(true);
}

Ответы [ 3 ]

6 голосов
/ 20 апреля 2019

Вот решение, но переработанное для лучшей организации:

describe('test window location\'s reload function', () => {
  const { reload } = window.location;

  beforeAll(() => {
    Object.defineProperty(window.location, 'reload', {
      configurable: true,
    });
    window.location.reload = jest.fn();
  });

  afterAll(() => {
    window.location.reload = reload;
  });

  it('mocks reload function', () => {
    expect(jest.isMockFunction(window.location.reload)).toBe(true);
  });

  it('calls reload function', () => {
    reloadFn(); // as defined above..
    expect(window.location.reload).toHaveBeenCalled();
  });
});

Спасибо:)

6 голосов
/ 21 апреля 2019

Вы можете использовать sessionStorage, чтобы сохранить значение для каждой перезагрузки. Пока браузер не закрывается, значение будет оставаться в sessionStorage. Когда страница перезагрузится, значение будет увеличиваться. Проверьте свежую перезагрузку с этим значением. Проверьте это, вставив reloadFn () в консоль. Консоль отобразит счетчик перезагрузок: 1 и будет увеличиваться с каждой перезагрузкой.

const reloadFn = () => {
  window.location.reload(true);
}

window.onload = function() {
    // get reloadCount from sessionStorage
    reloadCount = sessionStorage.getItem('reloadCount');

    // reloadCount will be null the first page load or a new value for each reload
    if (reloadCount) {
        // increment reloadCount
        reloadCount = parseInt(reloadCount) + 1;
        // save the new value to sessionStorage
        sessionStorage.setItem('reloadCount', reloadCount);
        console.log("Reload count: " + reloadCount);
    } else {
        // if reloadCount was null then set it to 1 and save to sessionStorage
        sessionStorage.setItem('reloadCount', 1);
        console.log("Page was loaded for the first time");
    }
}
4 голосов
/ 18 апреля 2019

Внутри тестирования вашей функции reloadFn, вы должны использовать макет, с которым вы связались:

Object.defineProperty(window.location, 'reload', {
    configurable: true,
}); // makes window.location.reload writable
window.location.reload = jest.fn(); // set up the mock
reloadFn(); // this should call your mock defined above
expect(window.location.reload).toHaveBeenCalled(); // assert the call
window.location.reload.mockRestore(); // restore window.location.reload to its original function

Для более улучшенного теста вы можете использовать

expect(window.location.reload).toHaveBeenCalledWith(true);

Следует отметить, что на самом деле это не проверка того, что окно перезагружается, что выходит за рамки юнит-теста. Что-то вроде тестирования браузера или интеграции может подтвердить это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...