Шутка: «контейнер не существует»

#reactjs #jestjs #babel-jest #react-scripts

#reactjs #jestjs #babel-шутка #реагирующие скрипты

Вопрос:

У меня есть очень простой тест

     const div = document.createElement("div");
    ReactDOM.render(<App />, div);
    ReactDOM.unmountComponentAtNode(div);
  

сбой в этом коде:

 componentDidMount() {
    const ProgressBar = require('progressbar.js');
    /* istanbul ignore next */
    const bar = new ProgressBar.Line('#progressDiv', {
        strokeWidth: 2,
        easing: 'easeInOut',
  

ошибка:

 ● renders without crashing

Container does not exist: #progressDiv

   6 |         const ProgressBar = require('progressbar.js');
   7 |         /* istanbul ignore next */
>  8 |         const bar = new ProgressBar.Line('#progressDiv', {
     |                     ^
   9 |             strokeWidth: 2,
  

контейнер действительно существует.

Я предполагаю, что это распространенная проблема, потому что componentDidMount выполняется перед рендерингом?

выполнить команду:

npm test => "test": "react-scripts test --watchAll=false"

Версии:

 "react-scripts": {
  "version": "2.1.5",
  "jest": "23.6.0",
  

Ответ №1:

после долгих мучений я решил это с помощью макета.

 jest.mock('../components/app/App');

it("renders without crashing", () => {

    const spy = jest.fn()
    App.prototype.componentDidMount.mockImplementation(() => spy())

    const div = document.createElement("div");
    ReactDOM.render(<App />, div);
    ReactDOM.unmountComponentAtNode(div);
});
  

это проходит мои тесты, хотя vs code все еще жалуется

mockImplementation не существует для type () => void