Почему Window.location.search не определен, даже если Window.location.href содержит строку запроса? - PullRequest
0 голосов
/ 30 января 2020

Я написал функцию для получения значения заданной строки запроса на основе Дэвида Уолла sh Получить параметры строки запроса .

export const getQueryStringValue = (name) => {
  const formattedName = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
  const regex = new RegExp(`[\\?&]${formattedName}=([^&#]*)`);
  const results = regex.exec(window.location.search);

  return results === null
    ? ''
    : decodeURIComponent(results[1].replace(/\+/g, ' '));
};

У меня есть написал тест для функции на основе Как смоделировать window.location.href с Jest + Vuejs? .

it('should return query string value', () => {
  global.window = Object.create(window);
  const url = 'http://dummy.com?foo=bar';
  Object.defineProperty(window, 'location', {
    value: {
      href: url
    }
  });

  expect(getQueryStringValue('foo')).toBe('bar');
});

Однако, когда я запускаю тест, я получаю следующее ошибка.

expect(received).toBe(expected) // Object.is equality

Expected: "bar"
Received: ""

И когда я консоль журнала window.location.search, он возвращает undefined.

  console.log __tests__/getQueryStringValue.test.js:14
    undefined

Почему поиск Window.location возвращает undefined, даже когда Window.location href включает строку запроса (?foo=bar)? Разве установки href не должно быть достаточно?

1 Ответ

1 голос
/ 30 января 2020

Поиск в Window.location не происходит автоматически при установке Window.location href, поскольку jsdom в настоящее время не обрабатывает навигацию . У вас есть пара вариантов для устранения ошибки.

Опция 1: Установить поиск Window.location

it('should return query string value', () => {
  global.window = Object.create(window);
  Object.defineProperty(window, 'location', {
    value: {
      search: '?foo=bar'
    }
  });

  expect(getQueryStringValue('foo')).toBe('bar');
});

Опция 2: Установить Window.location в Новый URL Экземпляр

it('should return query string value', () => {
  global.window = Object.create(window);
  Object.defineProperty(window, 'location', {
    value: new URL('http://dummy.com/?foo=bar')
  });

  expect(getQueryStringValue('foo')).toBe('bar');
});

Источник: { ссылка }

...