Шутка издевается - PullRequest
       45

Шутка издевается

0 голосов
/ 28 октября 2019

Мой компонент React вызывает window.scrollTo, и когда я запускаю свои шутливые тесты, они проходят, но возникает консольная ошибка:

 console.error node_modules/jsdom/lib/jsdom/virtual-console.js:29
Error: Not implemented: window.scrollTo
    at Object.<anonymous>.module.exports (/private/var/www/samplesite.com/node_modules/jsdom/lib/jsdom/browser/not-implemented.js:9:17)
    at Window.scrollTo (/private/var/www/samplesite.com/node_modules/jsdom/lib/jsdom/browser/Window.js:544:7)
    at scrollTo (/private/var/www/samplesite.com/back-end/utils/library.jsx:180:12)
    at commitHookEffectList (/private/var/www/samplesite.com/node_modules/react-dom/cjs/react-dom.development.js:17283:26)
    at commitPassiveHookEffects (/private/var/www/samplesite.com/node_modules/react-dom/cjs/react-dom.development.js:17307:3)
    at Object.invokeGuardedCallbackImpl (/private/var/www/samplesite.com/node_modules/react-dom/cjs/react-dom.development.js:74:10)
    at invokeGuardedCallback (/private/var/www/samplesite.com/node_modules/react-dom/cjs/react-dom.development.js:256:31)
    at commitPassiveEffects (/private/var/www/samplesite.com/node_modules/react-dom/cjs/react-dom.development.js:18774:9)
    at wrapped (/private/var/www/samplesite.com/node_modules/react-dom/node_modules/scheduler/cjs/scheduler-tracing.development.js:207:34)
    at flushPassiveEffects (/private/var/www/samplesite.com/node_modules/react-dom/cjs/react-dom.development.js:18822:5) undefined

Я пытался имитировать его несколькими способами (оба впроверить себя, а также в шутке setupFiles, которая вызывается перед каждым тестом), но ошибка консоли не исчезнет:

Попытка 1:

let window = {};
window.scrollTo = jest.fn();

Попытка 2:

let scrollTo = jest.fn();
Object.defineProperty(window, "scrollTo", scrollTo);

Попытка 3:

delete global.window.scrollTo;
global.window.scrollTo = () => {};

Попытка 4:

global.window = {};
global.window.scrollTo = () => {};

Как я могу избавиться от этой ошибки консоли? Благодаря.

Ответы [ 2 ]

1 голос
/ 28 октября 2019

Для меня макет window.scrollTo в каждом тестовом случае. Или поместите фиктивный код в файл window.setup.js и добавьте путь этого файла в конфигурацию jest setupFiles, оба эти способа работают нормально.

Например,

index.spec.tsx:

import React, { Component } from 'react';

class SomeComponent extends Component {
  constructor(props) {
    super(props);
    this.handleClick = this.handleClick.bind(this);
  }

  handleClick(e) {
    e.preventDefault();
    window.scrollTo(0, 0);
  }

  render() {
    return (
      <div>
        <button onClick={this.handleClick}>Click Me!</button>
      </div>
    );
  }
}

export default SomeComponent;

index.spec.tsx, макет window.scrollTo в каждом тестовом случае.

import React from 'react';
import { shallow } from 'enzyme';
import SomeComponent from './';

describe('SomeComponent', () => {
  test('should handle click', () => {
    const wrapper = shallow(<SomeComponent></SomeComponent>);
    const mEvent = { preventDefault: jest.fn() };
    window.scrollTo = jest.fn();
    wrapper.find('button').simulate('click', mEvent);
    expect(mEvent.preventDefault).toBeCalled();
    expect(window.scrollTo).toBeCalledWith(0, 0);
  });
});

jest.config.js:

module.exports = {
  preset: 'ts-jest',
  testEnvironment: 'enzyme',
  // setupFiles: ['/Users/ldu020/workspace/github.com/mrdulin/jest-codelab/src/stackoverflow/58585527/window.setup.js'],
  setupFilesAfterEnv: ['jest-enzyme'],
  testEnvironmentOptions: {
    enzymeAdapter: 'react16'
  },
  coverageReporters: ['json', 'text', 'lcov', 'clover']
};

Результат модульного теста:

 PASS  src/stackoverflow/58585527/index.spec.tsx (6.114s)
  SomeComponent
    ✓ should handle click (12ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        6.947s

Или создайте файл window.setup.js и укажите путь к файлу в jest setupFiles:

window.setup.js:

window.scrollTo = jest.fn();

jest.config.js:

module.exports = {
  preset: 'ts-jest',
  testEnvironment: 'enzyme',
  setupFiles: ['/Users/ldu020/workspace/github.com/mrdulin/jest-codelab/src/stackoverflow/58585527/window.setup.js'],
  setupFilesAfterEnv: ['jest-enzyme'],
  testEnvironmentOptions: {
    enzymeAdapter: 'react16'
  },
  coverageReporters: ['json', 'text', 'lcov', 'clover']
};

Результат модульного теста:

 PASS  src/stackoverflow/58585527/index.spec.tsx
  SomeComponent
    ✓ should handle click (12ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        3.33s, estimated 7s

Оба они работают нормально.

Исходный код: https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/58585527

0 голосов
/ 28 октября 2019

Настройка window.scrollTo = jest.fn ();должно работать, и если вы хотите определить его для всего проекта, а не для каждого тестового файла в отдельности, вы можете определить его в setupFilesAfterEnv

Или при использовании response-scripts вы можете определить его в. /src/setupTests.js

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...