Как имитировать / тестировать прослушиватели событий с помощью mocha / jest?

#javascript #testing #mocha.js #jestjs

#javascript #тестирование #mocha.js #jestjs

Вопрос:

 class Router {
    constructor() {
        window.onhashchange = this.hashChange;
    }

    hashChange() {
        console.log('Hash Changed');
        return true;
    }
}

export default Router;
  

Я пытаюсь найти способ протестировать приведенный выше фрагмент кода в node.js . Но в node нет window объекта. Как имитировать объекты и тестировать прослушиватели событий с помощью mocha / jest? Цель состоит в том, чтобы проверить, что hashChange() вызывается при изменении хэша URL

Ответ №1:

Тестовая среда по умолчанию в Jest — это среда, подобная браузеру, предоставляемая jsdom .

jsdom обеспечивает, window поэтому он доступен по умолчанию для тестов, выполняемых в Jest .

Вы можете использовать Jest для тестирования приведенного выше кода следующим образом:

 class Router {
  constructor() {
      window.onhashchange = this.hashChange;
  }

  hashChange() {
      console.log('Hash Changed');
      return true;
  }
}

test('Router', () => {
  const hashChangeSpy = jest.spyOn(Router.prototype, 'hashChange');
  const router = new Router();
  window.onhashchange();
  expect(hashChangeSpy).toHaveBeenCalled();  // Success!
});
  

Комментарии:

1. The default test environment in Jest is a browser-like environment provided by jsdom Итак, нужно ли мне добавлять jsdom в мой package.json? или это поставляется с jest?

2. @lch он включен в jest и используется автоматически с настройками конфигурации по умолчанию