为什么单元测试需要使用 fixture.detectChanges() [JasmineKarma] 。

问题描述 投票:0回答:1

我正在用Jasmine和Karma学习单元测试。我的测试用例是通过了,但我不明白一件事。这是我的排版稿。

// array list of objects where each month will have one object i.e. 12 objects (Jan to Dec)
monthsData: Array<{
    monthName: string;
    monthYear: number;
    isInRange: boolean;
    isLowerEdge: boolean;
    isUpperEdge: boolean;
}>;

rangeState: { edge1Exists: boolean; edge2Exists: boolean; edgeIndexes: Array<number> };

initRangeState() {} <---- method which should be called; Not important for this question

这是我的测试用例的规范文件。

it('should re-initialize range state when reflection is triggered', () => {
    fixture.detectChanges(); <--- why this is required ?
    const rangeState = { edge1Exists: true, edge2Exists: true, edgeIndexes: [] };
    const monthsData = {
        monthName: 'Jan',
        monthYear: 2020,
        isInRange: true,
        isLowerEdge: true,
        isUpperEdge: false
    };
    fixture.componentInstance.rangeState = rangeState;
    fixture.componentInstance.monthsData[0] = monthsData;
    ...
    expect(fixture.componentInstance.initRangeState).toHaveBeenCalled();
});

我不明白的是,当我通过dummy的时候 rangeStatemonthsData 已经。那我为什么要跑 fixture.detectChanges() 排在第一位。我的测试用例没有调用就失败了。请告诉我背后的原因。我相信一定有我不知道的原因。fixture.detectChanges() 被删除。

enter image description here

angular unit-testing karma-jasmine
1个回答
1
投票

https:/angular.ioguidetesting。:

您必须通过调用 fixture.detectChanges() 告诉 TestBed 执行数据绑定。

[...]

延迟变化检测是有意的和有用的。它让测试人员有机会在Angular启动数据绑定和调用生命周期钩子之前检查和改变组件的状态。

© www.soinside.com 2019 - 2024. All rights reserved.