Утверждения играют решающую роль в обеспечении того, чтобы ожидаемые результаты соответствовали фактическим результатам. Однако есть сценарии, в которых утверждения не работают, даже если сравниваемые тексты кажутся идентичными.

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

Рассмотрим этот вопрос подробнее на примере:

О, разочарование!

Обработка неразрывных пробелов:

Неразрывные пробелы, представленные 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);
}

Убедитесь, что ваши тесты учитывают неразрывные пробелы при тестировании приложения, которое использует неразрывные пробелы!