如何在 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();
  });