andreys75
@andreys75

Как тестировать pipe с зависимостью от абстрактного класса DomSanitizer?

Добрый день!

Я новичек в написании unit тестов, пытаюсь написать осмысленный тест для pipe который позволяет выводить html в шаблоне
pipe:
import { Pipe, PipeTransform } from '@angular/core';
import { DomSanitizer, SafeHtml, SafeStyle, SafeScript, SafeUrl, SafeResourceUrl } from '@angular/platform-browser';

@Pipe({
  name: 'safe'
})
export class SafePipe implements PipeTransform {

  constructor(protected sanitizer: DomSanitizer) {}

 public transform(value: any, type: string): SafeHtml | SafeStyle | SafeScript | SafeUrl | SafeResourceUrl {
    switch (type) {
			case 'html': return this.sanitizer.bypassSecurityTrustHtml(value);
			case 'style': return this.sanitizer.bypassSecurityTrustStyle(value);
			case 'script': return this.sanitizer.bypassSecurityTrustScript(value);
			case 'url': return this.sanitizer.bypassSecurityTrustUrl(value);
			case 'resourceUrl': return this.sanitizer.bypassSecurityTrustResourceUrl(value);
			default: throw new Error(`Invalid safe type specified: ${type}`);
		}
  }
}


spec:
import { SafePipe } from './safe.pipe';
import { TestBed } from '@angular/core/testing';
import { DomSanitizer,  SafeHtml, SafeStyle, SafeScript, SafeUrl, SafeResourceUrl} from '@angular/platform-browser';

describe('SafePipe', () => {
  let  sanitizer: DomSanitizer;
  let  pipe: SafePipe;

  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [DomSanitizer]
    }).compileComponents();
    sanitizer = TestBed.get(DomSanitizer);
    pipe = new SafePipe(sanitizer);

  });

  it('create an instance', () => {
     expect(pipe).toBeTruthy();
  });

  it('it should return safe HTML', () => {
    const html = '<h1>Title</h1>';
    const safeHtml = pipe.transform(html, 'html');
    expect(pipe.transform(html, 'html')).toBe(html);
  });
});

Получаю ошибку:
TypeError: this.sanitizer.bypassSecurityTrustHtml is not a function
TypeError: this.sanitizer.bypassSecurityTrustHtml is not a function
at SafePipe../src/app/core/pipes/safe.pipe.ts.SafePipe.transform (localhost:9876/_karma_webpack_/webpack:/src/app/co...

DomSanitazer абстрактный класс.

Сначала написал более простой варинат теста, с той-же ошибкой:
import { SafePipe } from './safe.pipe';
import { TestBed } from '@angular/core/testing';
import { DomSanitizer,  SafeHtml, SafeStyle, SafeScript, SafeUrl, SafeResourceUrl} from '@angular/platform-browser';

describe('SafePipe', () => {
  let  sanitizer: DomSanitizer;
  const pipe = new SafePipe(sanitizer);

  it('create an instance', () => {
     expect(pipe).toBeTruthy();
  });

  it('it should return safe HTML', () => {
    const html = '<h1>Title</h1>';
    expect(pipe.transform(html,'html')).toBe(html);
  });
});


Вопрос как тестировать такие pipe's
  • Вопрос задан
  • 25 просмотров
Пригласить эксперта
Ответы на вопрос 1
Xuxicheta
@Xuxicheta
инженер
Берем скажем ts-mockito, мокаем DomSanitizer, делаем его экемпляр в переменную sanitizer. а потом смотрим количество вызовов соотвествующего метода. т.е. bypassSecurityTrustHtml.
Как тут https://github.com/NagRock/ts-mockito#basics
Можно вручную мокнуть, тут просто.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
от 100 000 до 150 000 руб.
FINCH Москва
от 80 000 руб.
Quiet Media Москва
До 100 000 руб.
11 нояб. 2019, в 22:15
4000 руб./за проект
11 нояб. 2019, в 22:12
1000 руб./за проект
11 нояб. 2019, в 21:54
1 руб./за проект