我有一个Angular 6应用程序并编写一些单元测试,试图确定一个元素是否可见,仅仅基于*ngIf
指令的布尔结果。
标记:
<div class="header" *ngIf="show">
<div>...</div>
</div>
规范文件:
it('should hide contents if show is false', () => {
const button = debugElement.query(By.css('button')).nativeElement;
button.click(); // this will change show to false
fixture.detectChanges();
expect(debugElement.query(By.css('.header')).nativeElement.style.hidden).toBe(true);
});
我似乎无法从div获得hidden
属性。 angular是否使用另一种方法使用*ngIf
指令从DOM中隐藏元素?我需要从nativeElement
获得另一处房产吗?
谢谢!
如果元素被隐藏,那么它将不会在dom中呈现。
你可以检查一下
expect(fixture.debugElement.query(By.css('.header'))).toBeUndefined();
编辑:toBeNull()
在上述情况下效果更好
expect(fixture.debugElement.query(By.css('.header'))).toBeNull();
并且在获取按钮元素时也会出现语法错误。 nativeElement
不是一个功能。
这样改变:
const button = fixture.debugElement.query(By.css('button')).nativeElement;
当测试是否使用ngIf
显示组件时,我尝试获取元素(在这种情况下,你使用,即debugElement.query(By.css('.header')).nativeElement
),如果它应该显示我希望它是真实的,否则是假的。
像这样的东西:
it('should hide contents if show is false', () => {
// should be rendered initially
expect(debugElement.query(By.css('.header')).nativeElement).toBeTruthy();
//trigger change
const button = debugElement.query(By.css('button')).nativeElement;
button.click(); // this will change show to false
fixture.detectChanges();
// should not be rendered
expect(debugElement.query(By.css('.header')).nativeElement).toBeFalsy();
});
另外,请记住,有时您需要使用ComponentFixture#whenStable
来检测灯具何时稳定,如下所示:
it('should hide contents if show is false', () => {
const fixture = TestBed.createComponent(AppComponent);
fixture.whenStable().then(() => {
// same test code here
});
});
使用ngIf时,angular会从标记中完全删除节点。所以你需要检查这个元素是不存在的。
ngIf计算表达式,然后当表达式分别为真或假时,将then或else模板呈现在其位置。
更确切地说,它只是没有渲染
为qazxsw poi编写测试用例有条件使用qazxsw poi条件。
尝试下面的代码,它适合我。
*ngIf