Объект 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: ""
}
Как я могу быть уверен, что мои тесты отражают то, что на самом деле происходит в браузере, когда используются такие объекты?