如何在 Angular Ag Grid 中测试 AgRendererComponent 组件
How to test AgRendererComponent component in Angular Ag Grid
我有一个自定义单元格渲染器组件,可以将文本转换为 link。一切正常。我正在尝试对渲染器组件进行单元测试。单元测试中面临的问题是网格显示 link 但是当我通过本机元素查询时它不可用,我得到的值是空的,其他网格值已经存在我能够看到它。我认为这与测试或 AG 网格渲染的生命周期有关。我如何告诉测试框架等待组件呈现?
link 渲染器组件
@Component({
template: '<a [routerLink]="[params.inRouterLink,params.value]" (click)="navigate(params.inRouterLink)">{{params.value}}</a>'
})
export class RouterLinkRendererComponent implements AgRendererComponent {
params: any;
constructor(
private ngZone: NgZone,
private router: Router) { }
agInit(params: any): void {
this.params = params;
}
refresh(params: any): boolean {
return false;
}
}
测试组件:
@Component({
template: `
<ag-grid-angular
style="width: 500px; height: 500px;"
class="custom-theme"
[rowData]="rowData"
[columnDefs]="columnDefs"
(gridReady)="onGridReady($event)"
>
</ag-grid-angular>
`
})
export class TestCustomComponent {
columnDefs = [
{
headerName: 'Make',
field: 'make',
cellRendererFramework: RouterLinkRendererComponent,
cellRendererParams: {
inRouterLink: '/#'
}
},
{ headerName: 'Model', field: 'model' },
{ headerName: 'Price', field: 'price' }
];
rowData = [
{ make: 'Toyota', model: 'Celica', price: 35000 },
{ make: 'Ford', model: 'Mondeo', price: 32000 },
{ make: 'Porsche', model: 'Boxter', price: 72000 }
];
}
单元测试
fdescribe('AgnavigatorComponent', () => {
let component: TestCustomComponent;
let fixture: ComponentFixture<TestCustomComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [RouterLinkRendererComponent, TestCustomComponent],
imports: [
RouterTestingModule,
AgGridModule.withComponents([RouterLinkRendererComponent])
]
}).compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(TestCustomComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
const appElement = fixture.nativeElement;
// here the values are empty only for the first column which uses custom renderer.
const cellElements = appElement.querySelectorAll('.ag-cell-value');
});
});
测试执行完成后,我可以看到具有正确值的列,其中包含 href。
问题是执行时组件尚未加载。所以必须引入 SO.post 中提到的等待功能,我必须等到这个人进来。
export const waitUntil = async (
untilTruthy: () => boolean
): Promise<boolean> => {
while (!untilTruthy()) {
await interval(25)
.pipe(take(1))
.toPromise();
}
return Promise.resolve(true);
};
测试如下
it('should render the component', async done => {
let appElement: any;
let cellElement: any;
fixture.detectChanges();
await fixture.whenStable();
await waitUntil(() => {
appElement = fixture.nativeElement;
cellElement = appElement.querySelectorAll('.ag-cell-value');
if (cellElement[0].textContent !== '') {
return true;
}
return false;
});
expect(cellElement[0].children[0].children[0].href.split('/')[3]).toEqual(
'Toyota'
);
done();
});
我有一个自定义单元格渲染器组件,可以将文本转换为 link。一切正常。我正在尝试对渲染器组件进行单元测试。单元测试中面临的问题是网格显示 link 但是当我通过本机元素查询时它不可用,我得到的值是空的,其他网格值已经存在我能够看到它。我认为这与测试或 AG 网格渲染的生命周期有关。我如何告诉测试框架等待组件呈现?
link 渲染器组件
@Component({
template: '<a [routerLink]="[params.inRouterLink,params.value]" (click)="navigate(params.inRouterLink)">{{params.value}}</a>'
})
export class RouterLinkRendererComponent implements AgRendererComponent {
params: any;
constructor(
private ngZone: NgZone,
private router: Router) { }
agInit(params: any): void {
this.params = params;
}
refresh(params: any): boolean {
return false;
}
}
测试组件:
@Component({
template: `
<ag-grid-angular
style="width: 500px; height: 500px;"
class="custom-theme"
[rowData]="rowData"
[columnDefs]="columnDefs"
(gridReady)="onGridReady($event)"
>
</ag-grid-angular>
`
})
export class TestCustomComponent {
columnDefs = [
{
headerName: 'Make',
field: 'make',
cellRendererFramework: RouterLinkRendererComponent,
cellRendererParams: {
inRouterLink: '/#'
}
},
{ headerName: 'Model', field: 'model' },
{ headerName: 'Price', field: 'price' }
];
rowData = [
{ make: 'Toyota', model: 'Celica', price: 35000 },
{ make: 'Ford', model: 'Mondeo', price: 32000 },
{ make: 'Porsche', model: 'Boxter', price: 72000 }
];
}
单元测试
fdescribe('AgnavigatorComponent', () => {
let component: TestCustomComponent;
let fixture: ComponentFixture<TestCustomComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [RouterLinkRendererComponent, TestCustomComponent],
imports: [
RouterTestingModule,
AgGridModule.withComponents([RouterLinkRendererComponent])
]
}).compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(TestCustomComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
const appElement = fixture.nativeElement;
// here the values are empty only for the first column which uses custom renderer.
const cellElements = appElement.querySelectorAll('.ag-cell-value');
});
});
测试执行完成后,我可以看到具有正确值的列,其中包含 href。
问题是执行时组件尚未加载。所以必须引入 SO.post 中提到的等待功能,我必须等到这个人进来。
export const waitUntil = async (
untilTruthy: () => boolean
): Promise<boolean> => {
while (!untilTruthy()) {
await interval(25)
.pipe(take(1))
.toPromise();
}
return Promise.resolve(true);
};
测试如下
it('should render the component', async done => {
let appElement: any;
let cellElement: any;
fixture.detectChanges();
await fixture.whenStable();
await waitUntil(() => {
appElement = fixture.nativeElement;
cellElement = appElement.querySelectorAll('.ag-cell-value');
if (cellElement[0].textContent !== '') {
return true;
}
return false;
});
expect(cellElement[0].children[0].children[0].href.split('/')[3]).toEqual(
'Toyota'
);
done();
});