Я использую AG-Grid, который предоставляет метод обратного вызова для завершения инициализации таблицы.
Мне нужно убедиться, что этот метод вызывается после завершения инициализации таблицы, но я неуверен, какой способ пойти об этом.Перед тем, как создать компонент, необходимо следить за методом, потому что он уже был вызван без явного запуска в моем тесте.
Я попытался настроить шпиона, а затем заново создать компонент с помощью TestBed.createComponent()
но я не думаю, что шпион работает, потому что он подключен к ранее созданному fixture.componentInstance
.
Сетка:
<ag-grid-angular
id="strategyListGrid"
[rowData]="strategyList$ | async"
[columnDefs]="columnDefs"
(gridReady)="onGridReady($event)">
</ag-grid-angular>
Функция компонента:
/**
* Fetch GridApi from initialized ag-grid
* @param params GridEvent fired from component when initialization has completed
*/
onGridReady(params: GridReadyEvent) {
this.gridApi = params.api;
this.triggerTableResize();
}
Код теста:
function setup() {
let fixture = TestBed.createComponent(StrategyListComponent);
let app = fixture.componentInstance;
return { app, fixture };
}
it('should resize the table when grid is ready', () => {
const { fixture, app } = setup();
let resizeSpy = spyOn(app, 'onGridReady');
let fixtureRefresh = TestBed.createComponent(StrategyListComponent);
fixtureRefresh.detectChanges();
fixtureRefresh.whenStable().then(() => {
expect(resizeSpy).toHaveBeenCalled();
});
});
Сбой при: Expected spy onGridReady to have been called
Я не уверен, что это правильный способ шпионить за компонентным методом до его создания.Но если это так, возможно, мне нужно использовать fakeAsync
, чтобы подождать, пока не будет вызван метод.
РЕДАКТИРОВАТЬ: у меня есть рабочая версия, но она не очень чистая
it(
'should resize the table when grid is ready',
fakeAsync(() => {
const { app, fixture } = setup();
let gridReadySpy = spyOn(app, 'onGridReady');
fixture.detectChanges();
flush();
fixture.whenStable().then(() => {
fixture.detectChanges(); // Refresh template view
flush();
expect(gridReadySpy).toHaveBeenCalled();
});
})
);