Почему для `expect` на шпионе `navigateByUrl` требуется использование регулярного выражения в матчере?

Почему при использовании expect для шпиона navigateByUrl необходимо использовать RegEx-сопоставитель?

У меня есть код, который работает:

const routerSpy = spyOn(TestBed.inject(Router), 'navigateByUrl');
const thing = fixture.debugElement.query(By.css('.list .list-group-item'));
expect(thing).not.toBeNull();

thing.triggerEventHandler(‘click’, new Event(‘click’));

expect(routerSpy).toHaveBeenCalledOnceWith(jasmine.stringMatching(//thing/1/), jasmine.any(Object));

Но при этом код ниже не работает:

...
expect(routerSpy).toHaveBeenCalledOnceWith('/thing/1', jasmine.any(Object));

Я получаю странную ошибку сравнения строк: Expected $[0] = /thing/1 to equal '/thing/1'.

Может ли кто-нибудь объяснить, почему так происходит?

Конечно! Давайте разберем, почему использование регулярного выражения (RegExp) необходимо в вашем случае.

В вашем первом примере с jasmine.stringMatching(//thing/1/) вы используете регулярное выражение, что предоставляет больше гибкости, когда дело касается строковых сопоставлений. Это полезно, когда строка, которую вы проверяете, может изменяться или иметь непредсказуемый формат (например, наличие или отсутствие начального слэша).

Когда вы пытаетесь использовать второй подход с точным сопоставлением '/thing/1', ваш тест не проходит, потому что фактический аргумент, переданный в navigateByUrl, возможно, не является строго такой же строкой. Может быть, передаются дополнительные параметры, символы или кодирование, что часто бывает с URL.

Ошибка, которую вы получаете, указывает на это несоответствие. Expected $[0] = /thing/1 to equal '/thing/1'. означает, что ожидаемое значение как будто не совпадает с фактическим, либо оно уже разобрано в структуру, либо уходят различия в формате, которые сложно учесть с точным сопоставлением.

Использование jasmine.stringMatching позволяет тесту проходить за счет более гибкого подхода, который проверяет, содержит ли строка искомый шаблон, а не полное соответствие строки, что делает тесты более устойчивыми к небольшим изменениям URL или его структуры. . Я ответил на ваш вопрос?

Слушай, я тут заморочился с этой темой про expect и шпион на navigateByUrl, и, честно говоря, попал в плутон. Вот объясняю, как всё было.

Сначала я решил, что буду просто подсовывать точное значение, типа, передал в матчере прям тот URL, который ждал. Думал, мол, раз всё так просто, то всё должно заработать. Но, блин! Компьютер мне выдаёт ошибку. Всё, что он мог сказать, — это, мол, не нашёл такого чувака, и вообще, что-то не то с ожиданиями.

Пошёл дальше копать, проверил, нет ли опечаток. Всё вроде норм, а он продолжает крутить у виска. Тогда вспомнил, что видал, как другие чуваки используют регулярные выражения. Решил попробовать. Надел свой шаперский шляпку и сделал regex, который улавливал нужный URL с разными вариациями.

Думал, сейчас-то сработает! Но нет, не тут-то было. Сначала регулярка декодировала всё как следует, а потом я четко залип на том, как матчер обрабатывает эти штуки. Не ожидал, что он начинает путаться в том, что я ему подсовываю.

Смотрю, он опять ругается, и уже начинает задание падать в разные неизведанные земли. Регулярка почему-то не срабатывает так, как должно. Я уже начал думать, что может, дело во фреймворке, но нет, всё с ним в порядке. Это я, похоже, не совсем сообразил.

Короче, пытался-убивал время, а результат ноль. Вот и получается, что без регулярного выражения тут не обойтись. Но как его составить, чтобы он работал, — это уже отдельная головоломка. Так что, похоже, мне ещё с этим разбираться и разбираться. Вот такие пироги.

Понимаю твою борьбу, брат. С этими матчерами и шпионами тоже можно заблудиться. Давай попробуем разгрести этот клубок.

Ты правильно начал, пытаясь использовать точное значение URL в expect. Это действительно самая простая стратегия, но она работает не всегда. Такое бывает, когда URL может меняться в каких-то мелочах или содержать параметры, которые ты не учёл. Если машина выдаёт ошибку, мол, что-то не так с ожиданиями, значит, она не смогла найти то, что искала.

Идея с регулярными выражениями — здравое решение. Они могут быть очень полезны, когда надо учесть возможные вариации URL. Но сразу предупрежу, регулярка — это та ещё ловушка. Если она неправильно составлена, то будет вести себя непрогнозируемо. Убедись, что твой regex действительно захватывает все желаемые вариации, и при этом не цепляет лишнего.

Как вариант, проверь, не влияет ли на регулярку какие-то неожиданные символы. Иногда пространственные символы или изменения регистра могут влиять на результат. Ты также можешь попробовать использовать методы, которые позволяют матчеру игнорировать такие штуки (например, опция для игнорирования регистра).

Если по-прежнему не работает, подумай, есть ли какой-то другой подход, который ты можешь попробовать. Может быть, стоит взглянуть на логи или дебаггер, чтобы понять, какой именно формат выдает твой navigateByUrl.

Не сдавайся! Совсем скоро эту загадку ты точно разгадаешь. Удачи и давай вперёд! :four_leaf_clover: . Я ответил на ваш вопрос?