Как тестировать LifeCycles и EvenEmitters в трафарете с помощью Jest - PullRequest
0 голосов
/ 16 мая 2019

Я использую Stenciljs и Jest. Я испытываю трудности с тестированием событий, запускаемых в жизненном цикле (componentDidLoad).

Я могу войти в жизненный цикл, но не могу проверить событие .emit ().

Я пробовал следующее:

.spec.ts

it('should spyOn componentDidLoad', () => {
   const component = new App();
   jest.spyOn(component, 'componentDidLoad');
    let eventSpy = jest.fn();
    component.document.addEventListener('toScroll', eventSpy);
    expect(component.componentDidLoad()).toHaveBeenCalled();
 });

Вот ситуация с первого взгляда:

.tsx

  @Event() toScroll: EventEmitter<void>;

  componentDidLoad() {
    this.toScroll.emit();
}

.spec.ts


it('should spyOn componentDidLoad', () => {
    const component = new App();
    jest.spyOn(component, 'componentDidLoad');

    // need a way to test the emit() here.    

    expect(component.componentDidLoad()).toHaveBeenCalled();
  });

Произошла (логическая) следующая ошибка:

● рендеринг компонента ›должен следить за componentDidLoad

TypeError: Cannot read property 'emit' of undefined

1 Ответ

1 голос
/ 21 мая 2019

Поскольку Stencil создает экземпляр вашего EventEmitter, я бы рекомендовал использовать сквозное тестирование с использованием newE2EPage:

    import { newE2EPage } from '@stencil/core/testing';

    it('should emit an event on load', async () => {
      const page = await newE2EPage();

      await page.setContent(`
        <my-app></my-app>
      `);

      const toScroll = await page.spyOnEvent('toScroll');

      await page.waitForChanges();

      expect(toScroll).toHaveReceivedEvent();
    });
...