开发者问题收集

使用 phantomjs 进行 Karma 测试因 ngIf 而失败

2017-09-28
246

我有一个 angular-cli 项目。

我想要测试的 html 如下所示:

<div *ngIf="!isMobile" class="shop-description">
  {{ description }}
</div>
<div class="shop-link">
  <span>
    {{ link}}
  </span>
</div>

测试如下所示:

  beforeEach(() => {
    fixture = TestBed.createComponent(ShopItemComponent);
    component = fixture.componentInstance;
    component.shop = ShopServiceMock.shops[0];
    component.isMobile = false;
    fixture.detectChanges();
  });
  it('should have a title', () => {
        fixture.detectChanges();
        const el = fixture.debugElement.nativeElement;
        expect(el.querySelector('div.shop-title>span').innerText).toContain('test');
    });

  it('should have a description', () => {
        fixture.detectChanges();
        const el = fixture.debugElement.nativeElement;
        expect(el.querySelector('div.shop-description').innerText).toContain('love');
    });

使用命令 ' ng test ' 一切都会通过,没有问题。

使用 ' npm run test:phantomjs -- --code-coverage ' 时,title 元素上的第一个测试通过,但 description 上的测试失败,显示:

TypeError: null is not an object (evaluating 'el.querySelector('div.shop-description').innerText')

2个回答

如果您有一个 *ngIf,它将元素设置为不存在。 这就是为什么您应该在查找之前先将 isMobile 设置为 false。

Nathan Gavenski
2018-12-06

我将 component.isMobile = false; 移到了 it('should... 内,错误就消失了。

我不确定为什么会这样,但如果有人能解释一下,我愿意听取我的意见。

gyc
2017-10-13