Утверждения играют решающую роль в обеспечении того, чтобы ожидаемые результаты соответствовали фактическим результатам. Однако есть сценарии, в которых утверждения не работают, даже если сравниваемые тексты кажутся идентичными.
Представьте, что вы столкнулись с ошибкой утверждения при сравнении ожидаемого и фактического текстов. Несмотря на их внешнее сходство, утверждение не соответствует действительности, оставляя вас в недоумении.
Рассмотрим этот вопрос подробнее на примере:
О, разочарование!
Обработка неразрывных пробелов:
Неразрывные пробелы, представленные 160-м символом Юникода, часто остаются незамеченными среди обычных пробелов (32-й символ Юникода). Эти символы могут мешать утверждениям, что приводит к неожиданным сбоям.
Выявление ошибки утверждения из-за неразрывных пробелов:
Чтобы определить наличие неразрывных пробелов и других скрытых специальных символов, мы можем перебирать каждый символ в тексте и проверять их коды символов или значения Unicode. Сравнивая эти значения посимвольно, мы можем выявить скрытые несоответствия.
Вот пример фрагмента кода, демонстрирующий процесс итерации:
export function expectedText(actualText, expectedText){ console.log('Actual text characters:'); for (let i = 0; i < actualText.length; i++) { console.log(actualText.charAt(i), actualText.charCodeAt(i)); } console.log('Expected text characters:'); for (let i = 0; i < expectedText.length; i++) { console.log(expectedText.charAt(i), expectedText.charCodeAt(i)); } expect(actualText).to.equal(expectedText); }
Вводя операторы журнала, мы можем легко определить несоответствие в символьном коде для пробелов между фактическим текстом и ожидаемым текстом.
Взгляните на захваченные операторы журнала ниже, демонстрирующие коды символов для неразрывного пробела (Unicode 160) и обычного пробела (Unicode 32):
Нормализация неразрывных пробелов:
Чтобы обеспечить согласованные и точные результаты, крайне важно заменить неразрывные пробелы на обычные пробелы перед выполнением сравнения текста.
Вот обновленная версия функции expectedText
, которая обрабатывает неразрывные пробелы:
Метод replace
вызывается для actualText
с регулярным выражением /\u00A0/g
для замены всех неразрывных пробелов (\u00A0
) обычными пробелами.
export function expectedText(actualText, expectedText){ console.log('Actual text characters:'); for (let i = 0; i < actualText.length; i++) { console.log(actualText.charAt(i), actualText.charCodeAt(i)); } console.log('Expected text characters:'); for (let i = 0; i < expectedText.length; i++) { console.log(expectedText.charAt(i), expectedText.charCodeAt(i)); } const normalizedActualText = actualText.replace(/\u00A0/g, ' ').trim(); const normalizedExpectedText = expectedText.trim(); console.log('Actual text:', normalizedActualText); console.log('Expected text:', normalizedExpectedText); expect(normalizedActualText).to.equal(normalizedExpectedText); }
Убедитесь, что ваши тесты учитывают неразрывные пробелы при тестировании приложения, которое использует неразрывные пробелы!