Как может существующий модульный тест потерпеть неудачу при добавлении другого теста? - PullRequest
1 голос
/ 06 мая 2020

Это мой исходный код, и я недавно добавил onWindowClick.

  componentDidMount() {
    window.addEventListener('mouseup', this.onWindowMouseUp);
    window.addEventListener('click', this.onWindowClick, true);
   ...

  @bind
  onWindowClick(e) {
    if (!this.mouseInProgress) {
      return;
    }
    e.stopPropagation();
  }

  /**
   * Window mouse up handler.
   */
  @bind
  @debounce(0)
  onWindowMouseUp() {
    this.mousePoint = null;
    this.mouseInProgress = false;
  }

Функция выглядит хорошо, поэтому я пытаюсь добавить еще один тест для onWindowClick

describe('onWindowClick method', () => {

  const e = {
    stopPropagation: jest.fn(),
    clientX: 500,
    clientY: 700,
  };

  beforeEach(() => {
    instance.mouseInProgress = false;
    instance.onWindowClick();
  });
 test('should not stop propogation', () => {
    setTimeout(() => {
      instance.onWindowClick(e);
      expect(e.stopPropagation).toHaveBeenCalled();
    }, 0);
  });

Каким-то образом этот существующий тест не проходит модульное тестирование, а приведенное выше проходит. (ОЧЕНЬ СТРАННО)

describe('onWindowMouseUp method', () => {
  beforeEach(() => {
    instance.mousePoint = null;
    instance.mouseInProgress = false;
    instance.onWindowMouseUp();
  });

  test('should reset mousePoint', (done) => {
    setTimeout(() => {
      expect(instance.mousePoint).toBeNull();
      done();
    }, 0);
  });

Ошибка:

console.error
    Error: Uncaught [Error: expect(jest.fn()).toHaveBeenCalled()

    Expected number of calls: >= 1
    Received number of calls:    0]
        at reportException (.:62:24)
        at Timeout.callback [as _onTimeout] .(.)
        at listOnTimeout (..)
.        at processTimers (i.) JestAssertionError: 
    .expect(jest.fn()).toHaveBeenCalled()

    Expected number of calls: >= 1
    Received number of calls:    0
        at .:124:33
        at Timeout.callback [as _onTimeout] .(.)
        at listOnTimeout (.:549:17).
 .       at processTimers (..:492:7) {
      matcherResult: { message: [Function (anonymous)], pass: false }
    }

      at VirtualConsole.<anonymous> (..:29:45)
      at reportException (.:66:28)
      at .Timeout.callback [as _onTimeout] (.:645:7)
.

Error: expect(jest.fn()).toHaveBeenCalled()

Expected number of calls: >= 1
Received number of calls:    0

    at /U...:124:33
    at Timeout.callback [as _onTimeout] (/..)
    at listOnTimeout (i.)
    at processTimers (in.).

Если я удалю тестовый пример, все тесты пройдут; Странно, что вновь добавленный тестовый пример каким-то образом влияет на другой отдельный тест.

У меня была instance переменная вне тестов.

let instance
beforeEach(() => {
  ...
  wrapper = shallow(<V {...props} />);
  instance = wrapper.instance();
  instance.rootRef.current = {};
  instance.graphRootRef.current = {};

  wrapper.setState({
    boundsById,
  });

EDIT: каким-то образом я получаю ошибку из существующего метод, и трассировка стека показывает, что здесь появляется ошибка:

expect(e.stopPropagation).not.toHaveBeenCalled();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...