Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 在TestBed.createComponent()之前监视组件方法_Angular_Typescript_Jasmine_Angular7 - Fatal编程技术网

Angular 在TestBed.createComponent()之前监视组件方法

Angular 在TestBed.createComponent()之前监视组件方法,angular,typescript,jasmine,angular7,Angular,Typescript,Jasmine,Angular7,我使用的是AG Grid,它为表完成初始化时提供了回调方法 我需要确保在表完成初始化后调用此方法,但我不确定该怎么做。在实际创建组件之前,需要对该方法进行监视,因为在我的测试中,它已经被调用,而没有被显式触发 我尝试设置一个spy,然后使用TestBed.createComponent()重新创建组件,但我认为spy不起作用,因为它连接到先前创建的fixture.componentInstance 网格: 组件功能: /** * Fetch GridApi from initialized

我使用的是AG Grid,它为表完成初始化时提供了回调方法

我需要确保在表完成初始化后调用此方法,但我不确定该怎么做。在实际创建组件之前,需要对该方法进行监视,因为在我的测试中,它已经被调用,而没有被显式触发

我尝试设置一个spy,然后使用
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网格组件,而只是使用无错误模式