Как заглушки субкомпонента EventEmitter из модуля пользовательского интерфейса - PullRequest
0 голосов
/ 02 мая 2019

У меня есть проект Angular, в котором я использую фреймворк Clarity Design UI. Мой проект использует компонент DataGrid от Clarity и прослушивает его clrDgRefresh EventEmitter, который срабатывает в ответ на изменения базовых данных или взаимодействия с пользователем. Я пишу тесты для компонента, который включает в себя изменения, которые запускают этот EventEmitter, и я пытаюсь выяснить, как заглушить обратный вызов этих событий, чтобы они не запускались во время тестирования. Как я могу это сделать?

Шаблон моего компонента содержит

<clr-datagrid (clrDgRefresh)="dgRefresh($event)">

где @Output в компоненте DataGrid Clarity равен

@Output('clrDgRefresh') public refresh = new EventEmitter<ClrDatagridStateInterface<T>>(false);

и мой компонент имеет что-то вроде

@Debounce(400)
dgRefresh(event: any) {
  this.doSomething();
}

где я хочу заглушить doSomething в тестах (или просто запретить его вызов).

Мой файл спецификаций имеет:

TestBed.configureTestingModule({
      imports: [
        ClarityModule,
        ...
      ],
      ...
    })
    .compileComponents();

Я не могу просто spyOn(component, 'doSomething'), так как он заглушает только прямые вызовы функции, а не те, которые запускаются асинхронно через Clarity. Я также не могу сделать что-то , как это , так как я использую весь модуль, а не только один компонент.

Я также попытался получить экземпляр компонента DataGrid, созданного внутри моего компонента, и заглушить его с помощью

let datagridDebugElement = fixture.debugElement.query(By.css('.datagrid'));
let datagrid = datagridDebugElement.componentInstance;
spyOn(datagrid, 'refresh');

Но это также не работает (doSomething все еще вызывается). Как правильно подойти к этому?

...