Должен признаться, я провел больше e2e-тестов, чем реальных тестов компонентов, я поклялся себе исправить это ужасное поведение, надеюсь, добился большего прогресса в понимании глубоких частей Angular. Но теперь я совершенно сбит с толку довольно простым на вид тестом...
import { EuroCurrencyPipe } from './euro-currency.pipe';
describe('EuroCurrencyPipe', () => {
it('create an instance', () => {
const pipe = new EuroCurrencyPipe();
expect(pipe).toBeTruthy();
});
it('should be "100 €"', () => {
const pipe = new EuroCurrencyPipe();
const euroSum: string = pipe.transform(100);
expect(euroSum).toBe('100,00 €');
});
});
Действительно, в целом НИЧЕГО интересного, верно? Но давайте добавим упомянутую трубу... она предназначена для немецкой страницы без других валют.
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
name: 'euroCurrency'
})
export class EuroCurrencyPipe implements PipeTransform {
transform(value: number): string {
return new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR' }).format(value);
}
}
Но когда я запускаю тест, он терпит неудачу с сообщением об ошибке...
Expected '100,00 €' to be '100,00 €'.
Это сбивает меня с толку... euroSum.localeCompare('100,00 €')
приводит к 1 вместо ожидаемого 0
Что мне не хватает? Это действительно заставляет меня сомневаться в том немногом, что я уже знаю...
@Taplar О, я тоже это сделал ... без костей.
Да, строки - это примитивы, так что не думал, что это будет. Но пришлось попробовать. Это странно.
так во что оценивается евросумма?
@WillEvers Ну, как говорится в сообщении об ошибке кода, «100,00 €», но это почему-то НЕ совпадает со строкой, которой она должна быть равна.
вы можете добавить console.info(euroSum); после pipe.transform(100); строку и скажите мне, что такое сообщение журнала?
Итак, это как-то связано с двумя последними символами результата. Если я сохраню результат в var x
в своей консоли, а затем x.slice(0, -2) == '100,00'
получу true. Если я не срезаю или только слайс -1, чтобы оставить пробел, это ложно, независимо от того, что я изменяю второе значение, чтобы оно выглядело точно так же
Код символа пробела из результата — 160. Код символа для обычного пробела — 32.
Символьный код €
из результата и из копирования и вставки в литеральную строку равен 8364. Таким образом, пробел выглядит так, как будто он виноват.
@Taplar, я могу подтвердить то, что ты говоришь. И я собираюсь быть честным, я не ожидал, что это произойдет. Не могли бы вы написать это как ответ, чтобы я мог его принять?
Строки не равны, потому что по какой-то причине символьный код видимого пробела в вычисленном результате равен 160, тогда как обычный пробел равен 32. Вот почему они не равны. Я сам не могу объяснить, почему они такие разные, но они есть.
Ради интереса измените его с
toBe
наtoEqual