Поведение теста отличается между Node.js и браузером - PullRequest
0 голосов
/ 03 сентября 2018

Объект URL в браузере (в данном случае Chrome) по сравнению с Node.js не ведет себя одинаково. В результате я получаю тесты, которые проходят при запуске в Node, но поведение в браузере не совпадает.

Чтобы продемонстрировать, вот простая parseURL функция, которая пытается проанализировать URL из строки. Если он не может разобрать его должным образом, он вместо этого возвращает URL, который соответствует поиску в Google, используя предоставленную строку.

function parseURL(query) {
  const formattedQuery = query.includes('://') ? query : `http://${query}`;

  try {
    return new URL(formattedQuery);
  } catch (err) {
    return new URL(`https://www.google.com/search?q=${encodeURIComponent(query)}`);
  }
}

И простой тест Jest для демонстрации работы этой функции:

describe('parseURL', () => {
  it('accepts valid URL string', () => {
    expect(parseURL('https://example.com')).toEqual(
      new URL('https://example.com')
    );
  });

  it('prepends protocol when missing', () => {
    expect(parseURL('example.com')).toEqual(
      new URL('http://example.com')
    );
  });

  it('converts search queries', () => {
    expect(parseURL('example.com lol jk')).toEqual(
      new URL('https://www.google.com/search?q=example.com+lol+jk')
    );
  });
});

Первые два теста имеют поведение для обоих Node.js и браузера. Отлично!

Третий тест, однако, проходит в Node.js, даже если его поведение внутри браузера не совпадает. В частности, при вызове new URL('http://example.com lol jk') в Node.js возникает ошибка. В браузере ошибка не возникает, и вместо этого возвращается объект URL:

{
  href: "http://example.com%20lol%20jk/",
  origin: "http://example.com%20lol%20jk",
  protocol: "http:",
  username: "",
  password: "",
  hash: "",
  host: "example.com%20lol%20jk",
  hostname: "example.com%20lol%20jk",
  href: "http://example.com%20lol%20jk/",
  origin: "http://example.com%20lol%20jk",
  password: "",
  pathname: "/",
  port: "",
  protocol: "http:",
  search: "",
  searchParams: URLSearchParams {},
  username: ""
}

Как я могу быть уверен, что мои тесты отражают то, что на самом деле происходит в браузере, когда используются такие объекты?

1 Ответ

0 голосов
/ 03 сентября 2018

Проблема в том, что URL несовместим между реализациями.

Ожидается, что поведение

new URL('http://example.com lol jk')

выдает ошибку, это не правильный URL. Он правильно реализован в Node.js и Firefox, но не в Chrome (который якобы здесь называется «браузер»).

Безопасно полагаться на реализацию Node.js в Jest. В случае, если требуется согласованность в производстве, URL необходимо заменить реализацией, соответствующей спецификации, whatwg-url.

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