当在Angular中使用Jasmine使用*ngIf指令时,如何单元测试元素是否可见

J-m*_*man 15 javascript jasmine karma-jasmine angular angular-test

我有一个Angular 6应用程序,并编写一些单元测试,试图确定一个元素是否可见,仅仅基于*ngIf指令的布尔结果.

标记:

<div class="header" *ngIf="show">
    <div>...</div>
</div>
Run Code Online (Sandbox Code Playgroud)

规范文件:

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);
});
Run Code Online (Sandbox Code Playgroud)

我似乎无法hidden从div中获取属性.angular是否使用另一种方法使用*ngIf指令从DOM中隐藏元素?我需要从另一个房产nativeElement

谢谢!

Ami*_*ani 21

如果元素被隐藏,那么它将不会在dom中呈现.

你可以检查一下

expect(fixture.debugElement.query(By.css('.header'))).toBeUndefined();
Run Code Online (Sandbox Code Playgroud)

并且在获取按钮元素时也会出现语法错误.toBeNull()不是一个功能.

这样改变:

expect(fixture.debugElement.query(By.css('.header'))).toBeNull();
Run Code Online (Sandbox Code Playgroud)

  • 最终对我有用的是检查节点本身,就像你在这个答案的第一行中所做的那样.然而有趣的是,我没有检查`undefined`,而是使用`toBeNull()`函数检查节点是否为`null`.这似乎对我有用. (7认同)
  • 将“fixture.debugElement.query”与“expect(...)”调用结合使用时要小心。这可能会导致浏览器出现内存不足错误。发生在我身上。请参阅/sf/answers/3402433471/ (2认同)

JP *_*hna 10

将 'show' 的值更改为 true 后,需要添加fixture.detectChanges()

component.show = true;
fixture.detectChanges()
Run Code Online (Sandbox Code Playgroud)


lea*_*iro 5

在测试是否显示某个组件时,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();
});
Run Code Online (Sandbox Code Playgroud)

另外,请记住,有时您需要ComponentFixture#whenStable像这样检测夹具何时稳定:

  it('should hide contents if show is false', () => {
    const fixture = TestBed.createComponent(AppComponent);
    fixture.whenStable().then(() => {
      // same test code here
    });
  });
Run Code Online (Sandbox Code Playgroud)

看到这个工作测试组件,其类似于这种情况

见[ GitHub存储库 ]