提问者:小点点

Angular 2如何测试*ngIf显示/隐藏的内容


我在一个单元测试中遇到了一些困难,这个单元测试正在读取一些html,这些html是用*ngIf从DOM中添加/删除的。

这是DOM:

<div class="detailacc" (click)="showDet()">    
    <i class="fa" [class.fa-caret-right]="!showHideDet " [class.fa-caret-down]="showHideDet " aria-hidden="true"></i> 
    <h4>Expandable</h4>
</div>
<div *ngIf="showHideDet">
    <p class="detailHeader">Details header</p>
</div>

这是在第一个div的单击事件中调用的组件函数:

private showDet() { 
    console.log('show called');
    this.showHideDet = !this.showHideDet;
}

最后,这是规范:

it('should show the header when the expandable elem is clicked', async(() => 
{
    const fixture = TestBed.createComponent(DetailsComponent);
    const compiled = fixture.debugElement.nativeElement;
    let detPresent: boolean = false;
    for (let node of compiled.querySelectorAll('.detailacc')) {
        node.click();
    }

    setTimeout(() => {          
        console.log(compiled.querySelectorAll('.detailHeader'));
        for (let node of compiled.querySelectorAll('.detailHeader')) {
            if (node.textContent === 'Details header') {
                detPresent = true;
                break;
            }
        }
        expect(detPresent).toBeFalsy();
    }, 0);  
}));

正如您所看到的,我已经包装了代码,它搜索那些仅在setTimeout中*ngIf为true时才显示的DOM元素,如下面的如何检查ngIf是否生效,但我仍然没有得到任何结果。

另外,如果您想知道在该测试中是否调用了click,那么确实是因为该控制台。登录组件功能将显示在Karma控制台中。控制台。setTimeout中的日志显示一个节点列表(0),基本上没有包含该类的节点。找到的详细标题。


共1个答案

匿名用户

好的,经过多次试验和错误后,我发现如果您在setTimeout中调用fixture.detectChange(),它将显示*ngIF DOM