Использование Jest для отслеживания вызова метода в componentDidMount

недавно я хотел проверить, что какой-то пользовательский метод условно вызывается в componentDidMount метод компонента React.

componentDidMount() {
  if (this.props.initOpen) {
    this.methodName();
  }
}

Я использую Jest в качестве основы тестирования, которая включает jest.fn() для насмешек / шпионов. Я читал, что это было бы довольно тривиально проверить с Синон, сделав что-то вроде следующего:

sinon.spy(Component.prototype, "methodName");
const wrapper = mount(<Component {...props} />);
expect(wrapper.instance().methodName).toHaveBeenCalled();

Я пытаюсь воссоздать это с шуткой, Вот так:

Component.prototype.methodName = jest.fn();
const wrapper = mount(<Component {...props} />);
expect(wrapper.instance().methodName).toHaveBeenCalled();

этот код завершается с ошибкой и выдает следующее ошибка:

jest.fn() value must be a mock function or spy.
Received:
  function: [Function bound mockConstructor]

можно ли проверить эту функциональность с помощью Jest? И если да, то как?

2 ответов


ключ использует шутки spyOn метод. Должно быть так:

const spy = jest.spyOn(Component.prototype, 'methodName');
const wrapper = mount(<Component {...props} />);
wrapper.instance().methodName();
expect(spy).toHaveBeenCalled();

как найти здесь, например: тест, если функция называется react и enzyme

обратите внимание, что это также лучшая практика, чтобы очистить функцию шпиона после каждого тестового запуска

let spy

afterEach(() => {
  spy.mockClear()
})

https://facebook.github.io/jest/docs/en/jest-object.html#jestclearallmocks


Я знаю, что это немного поздно, но я наткнулся на это и предложил бы проверить componentDidMount инициирует вызов вложенного метода, чтобы ваш тест выглядел примерно так:

модуль

componentDidMount() {
  if (this.props.initOpen) {
    this.methodName();
  }
}