使用OnPush
变更检测策略进行单元测试组件时,调用fixture.detectChanges()
仅在第一次时有效。
According to this comment on GitHub,如果组件在构造函数中将fixture.componentInstance.cdRef.markForCheck();
作为cdRef注入,则可以通过调用ChangeDetectorRef
来进行修复。
它奏效了,但是由于我已经几次遇到这个问题,所以我想创建一个小助手来进行标准化,并使发生的事情更加明显。
interface IChangeDetectable {
[key: string]: ChangeDetectorRef;
}
export const forceChangeDetection =
<T extends IChangeDetectable>(fixture: ComponentFixture<T>) => {
const changeDetector = Object.values(fixture.componentInstance)
.find((method) => method['detectChanges'] != null);
if (changeDetector == null) {
throw new Error('component must include change detection method');
}
changeDetector.detectChanges();
};
这有点令人费解,因为我们有数十个组件,并且持有ChangeDetectorRef实例的成员没有标准名称。强类型输入确实非常重要,因为我宁愿打字稿捕获丢失的ChangeDetectorRef,而不是等待测试失败。
但是,如果我用forceChangeDetection(fixture)
来调用,其中fixture
是ComponentFixture<TestComponent>
打字稿抱怨TestComponent
中缺少索引签名,因为实现了IChangeDetectable
不等于让至少一个成员实现ChangeDetectorRef
我可以用打字稿吗?确保有一个值与给定类型匹配的成员?