Перейти к содержанию

Тестирование Pipe

Тестирование pipe самое легкое, поскольку обычно его класс имеет один единственный метод transform() и не нуждается в сервисах, а сами тесты даже не требуют утилиты TestBed.

Рассмотрим пример тестирования фильтра cutTxt, который обрезает строку, если ее длина превышает переданное значение, и добавляет в ее конец многоточие.

cut-txt.pipe.ts

1
2
3
4
5
6
7
@Pipe({ name: 'cutTxt' })
export class CutTxtPipe implements PipeTransform {
    transform(text: string, length: number): string {
        if (text.length <= length) return text;
        else return `${text.substr(0, length)}...`;
    }
}

cut-txt.pipe.spec.ts

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
describe('CutTxtPipe', () => {
    let cutTxt = new CutTxtPipe();

    it('doesn\'t transform "Hello, World!"', () => {
        expect(cutTxt.transform('Hello, World!', 50)).toBe(
            'Hello, World!'
        );
    });

    it('transforms "Hello, World!" to "Hello..."', () => {
        expect(cutTxt.transform('Hello, World!', 5)).toBe(
            'Hello...'
        );
    });
});

Для полноценного тестирования pipe также следует проверять корректность его работы в шаблоне компонента.

cut-txt-pipe-test.component.ts

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
@Component({
    selector: 'cut-txt-pipe-test',
    template: `
        <p id="case-1">
            {{ 'Hello, World!' | cutTxt: 50 }}
        </p>
        <p id="case-2">{{ 'Hello, World!' | cutTxt: 5 }}</p>
    `,
})
export class CutTxtPipeTestComponent {
    constructor() {}
}

cut-txt-pipe-test.component.spec.ts

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
describe('cutTxt in component template', () => {
    let fixture: ComponentFixture<CutTxtPipeTestComponent>;

    beforeEach(async(() => {
        TestBed.configureTestingModule({
            declarations: [CutTxtPipeTestComponent],
        })
            .compileComponents()
            .then(() => {
                fixture = TestBed.createComponent(
                    CutTxtPipeTestComponent
                );
            });
    }));

    it('#case-1 should contain "Hello, World"', () => {
        const el = fixture.debugElement.nativeElement.query(
            '#case-1'
        );
        expect(el.textContent).toBe('Hello, World!');
    });

    it('#case-2 should contain "Hello..."', () => {
        const el = fixture.debugElement.nativeElement.query(
            '#case-2'
        );
        expect(el.textContent).toBe('Hello...');
    });
});

Ссылки

Комментарии