Angular 在TestBed.createComponent()之前监视组件方法
我使用的是AG Grid,它为表完成初始化时提供了回调方法 我需要确保在表完成初始化后调用此方法,但我不确定该怎么做。在实际创建组件之前,需要对该方法进行监视,因为在我的测试中,它已经被调用,而没有被显式触发 我尝试设置一个spy,然后使用Angular 在TestBed.createComponent()之前监视组件方法,angular,typescript,jasmine,angular7,Angular,Typescript,Jasmine,Angular7,我使用的是AG Grid,它为表完成初始化时提供了回调方法 我需要确保在表完成初始化后调用此方法,但我不确定该怎么做。在实际创建组件之前,需要对该方法进行监视,因为在我的测试中,它已经被调用,而没有被显式触发 我尝试设置一个spy,然后使用TestBed.createComponent()重新创建组件,但我认为spy不起作用,因为它连接到先前创建的fixture.componentInstance 网格: 组件功能: /** * Fetch GridApi from initialized
TestBed.createComponent()
重新创建组件,但我认为spy不起作用,因为它连接到先前创建的fixture.componentInstance
网格:
组件功能:
/**
* 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();
});
});
这在以下情况下失败:
预期已准备好被调用
我不相信这是在组件方法创建之前监视它的正确方法。但如果是,我可能需要使用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();
});
})
);
无论如何,您不应该监视被测试的组件;这里实现的行为是什么?组件将一个服务注入构造函数中,它将“Service.getList()”可观察赋值给“strategyList$”—此get使用表上的异步管道解决。当该表呈现时,它会调用组件上的“onGridReady”。我想确保在创建组件时,它最终会调用onGridReady。我已经完成了测试,但我认为这不是一个非常干净的测试。顺便说一句,你为什么不应该监视正在测试的组件?因为它是你应该测试的东西。通过其公共API进行测试
@Input
s、呈现的DOM以及与合作者的交互。同意jonrsharpe。与其尝试验证ag grid是否在正确的时刻完成了其发射(gridReady)的工作,不如测试您的组件以及触发此eventEmitter时它会做什么,不是吗?因此,与其监视组件内部的方法,我宁愿断言,参数是在组件内部设置的,表的大小是调整的。为了实现这一点,我甚至不会使用真正的ag网格组件,而只是使用无错误模式。无论如何,你不应该监视正在测试的组件;这里实现的行为是什么?组件将一个服务注入构造函数中,它将“Service.getList()”可观察赋值给“strategyList$”—此get使用表上的异步管道解决。当该表呈现时,它会调用组件上的“onGridReady”。我想确保在创建组件时,它最终会调用onGridReady。我已经完成了测试,但我认为这不是一个非常干净的测试。顺便说一句,你为什么不应该监视正在测试的组件?因为它是你应该测试的东西。通过其公共API进行测试@Input
s、呈现的DOM以及与合作者的交互。同意jonrsharpe。与其尝试验证ag grid是否在正确的时刻完成了其发射(gridReady)的工作,不如测试您的组件以及触发此eventEmitter时它会做什么,不是吗?因此,与其监视组件内部的方法,我宁愿断言,参数是在组件内部设置的,表的大小是调整的。为了实现这一点,我甚至不会使用真正的ag网格组件,而只是使用无错误模式