使用 Karma 和 Jasmine 在 Angular 12 上测试 ResizeObserver 事件

Iog*_*gui 7 jasmine typescript karma-runner angular resize-observer

我正在尝试使用 karma 和 jasmine 测试ResizeObserverAngular 12 应用程序中调用的代码。当我通过在浏览器上打开应用程序进行手动测试时,代码表现得非常好,但在我的单元测试中,业力似乎只是忽略了ResizeObserver. 有人知道在业力/茉莉花测试中使用是否存在一些问题ResizeObserver,导致其无法正常工作?

应用程序描述

我构建了一个简单的应用程序来隔离问题。核心代码是一个组件,它只绘制一个被 a 观察的 div ResizeObserver。观察者在调整大小时存储新的 div 大小,并且模板在自己的 div 内显示此信息。

组件核心代码:

@ViewChild('aDiv')
aDiv!: ElementRef;

resizeObserver!: ResizeObserver;

dimensions?: Dimensions;

constructor(private zone: NgZone) { }

ngOnInit(): void {
  const that = this;
  this.resizeObserver = new ResizeObserver(entries => {
    for (const entry of entries) {
      if(entry.target.tagName.toLowerCase() === 'div') {
        const div = entry.target as HTMLDivElement;
        that.onResize(div);
      }
    }
  });
}

ngAfterViewInit(): void {
  this.resizeObserver.observe(this.aDiv.nativeElement);
}

ngOnDestroy(): void {
  if(this.resizeObserver) {
    this.resizeObserver.disconnect();
  }
}

onResize(div: HTMLDivElement): void {
  const [width, height] = ResizableComponent.getDimensions(div);
  this.zone.run(() => {
    this.dimensions = {
      width: width,
      height: height
    }
  });
}
Run Code Online (Sandbox Code Playgroud)

模板:

<div #aDiv>
  <p>My dimensions are: ({{dimensions? dimensions.width + 'px' : 'unknown'}}, {{dimensions? dimensions.height + 'px' : 'unknown'}})</p>
</div>
Run Code Online (Sandbox Code Playgroud)

茉莉花/业力测试不起作用:

@Component({
  template: `
    <div id="resizeMe">
      <app-resizable></app-resizable>
    </div>
  `
})
class TestResizable {
  @ViewChild(ResizableComponent)
  resizable!: ResizableComponent;
}

describe('ResizableComponent as a nested component', () => {
  let component: TestResizable;
  let fixture: ComponentFixture<TestResizable>;

  let divResizeMe: HTMLDivElement;

  beforeEach(async () => {
    await TestBed.configureTestingModule({
      declarations: [ TestResizable, ResizableComponent ]
    }).compileComponents();
  });

  beforeEach(() => {
    fixture = TestBed.createComponent(TestResizable);
    component = fixture.componentInstance;
    fixture.detectChanges();

    divResizeMe = fixture.nativeElement.querySelector('#resizeMe');
  });

  it('should resize when external is resized', () => {
    divResizeMe.style.width = '200px';

    expect(component.resizable.dimensions).toBeTruthy();
    expect(component.resizable.dimensions?.width).toBe(200);
  });
});
Run Code Online (Sandbox Code Playgroud)

问题:

难道我做错了什么?该测试应该有效,但由于某些业力问题而无效?或者...我是否遗漏了一些明显的东西并且我的测试代码根本就是错误的?

如果你想使用完整的代码:

代码可用并在此 stackblitz 中工作(单元测试除外,该测试也可用但无法工作)

我也尝试过这个(没有成功):

it('should resize when external is resized', (done) => {
  divResizeMe.style.width = '200px';

  setTimeout(()=> {
    expect(component.resizable.dimensions).toBeTruthy();
    expect(component.resizable.dimensions?.width).toBe(200);
    done();
  }, 500);

});
Run Code Online (Sandbox Code Playgroud)

和这个:

it('should resize when external is resized', (done) => {
  divResizeMe.style.width = '200px';
  fixture.detectChanges();

  setTimeout(()=> {
    expect(component.resizable.dimensions).toBeTruthy();
    expect(component.resizable.dimensions?.width).toBe(200);
    done();
  }, 500);

});
Run Code Online (Sandbox Code Playgroud)