Класс pipe имеет один метод, transform, который манипулирует входным значением в преобразованное выходное значение. Реализация transform редко взаимодействует с DOM.
Большинство пайпов не зависят от Angular, кроме метаданных @Pipe и интерфейса.
Рассмотрим TitleCasePipe, который выводит первую букву каждого слова. Вот реализация с регулярным выражением.
1 2 3 4 5 6 7 8 910111213141516
import{Pipe,PipeTransform}from'@angular/core';@Pipe({name:'titlecase',pure:true})/** Transform to Title Case: uppercase the first letter of the words in a string. */exportclassTitleCasePipeimplementsPipeTransform{transform(input:string):string{returninput.length===0?'':input.replace(/\w\S*/g,(txt)=>txt[0].toUpperCase()+txt.slice(1).toLowerCase());}}
Все, что использует регулярное выражение, стоит тщательно протестировать. Используйте простой Jasmine для изучения ожидаемых и побочных случаев.
1 2 3 4 5 6 7 8 91011121314
describe('TitleCasePipe',()=>{// This pipe is a pure, stateless function so no need for BeforeEachconstpipe=newTitleCasePipe();it('transforms "abc" to "Abc"',()=>{expect(pipe.transform('abc')).toBe('Abc');});it('transforms "abc def" to "Abc Def"',()=>{expect(pipe.transform('abc def')).toBe('Abc Def');});// ... more tests ...});
Это тесты пайпа в изоляции. Они не могут определить, правильно ли работает TitleCasePipe в компонентах приложения.
Рассмотрите возможность добавления тестов компонентов, таких как этот:
1 2 3 4 5 6 7 8 91011121314151617181920212223
it('should convert hero name to Title Case',()=>{// get the name's input and display elements from the DOMconsthostElement:HTMLElement=harness.routeNativeElement!;constnameInput:HTMLInputElement=hostElement.querySelector('input')!;constnameDisplay:HTMLElement=hostElement.querySelector('span')!;// simulate user entering a new name into the input boxnameInput.value='quick BROWN fOx';// Dispatch a DOM event so that Angular learns of input value change.nameInput.dispatchEvent(newEvent('input'));// Tell Angular to update the display binding through the title pipeharness.detectChanges();expect(nameDisplay.textContent).toBe('Quick Brown Fox');});