Jest — имитация жирной стрелки в компоненте React

Учитывая мой компонент и тест ниже, почему мой метод confirmClickHandler все еще вызывается, когда я запускаю свой тест?

Примечание. Я заметил, что когда я меняю метод с функции толстой стрелки на обычную функцию, он корректно имитируется. Что мне здесь не хватает?

class CalendarConfirmation extends React.Component {
  ...

  confirmClickHandler = (e) =>  {
  ...
  }
}

и мой тест:

import React from 'react';
import {mount} from 'enzyme';
import CalendarConfirmation from '../components/CalendarConfirmation';

describe('Test CalendarConfirmation', () => {
  let calendarConfirmation;
  calendarConfirmation = mount (<CalendarConfirmation />);
  calendarConfirmation.instance().confirmClickHandler = jest.fn();
  ...
}

person JoshieWashie    schedule 04.08.2017    source источник
comment
Привет, хотел бы знать, как ты понял это, если ты это сделал.   -  person Neovea    schedule 17.10.2017


Ответы (2)


Это работает для меня:

import React from 'react'
import { mount, shallow } from 'enzyme'

class Foo extends React.Component {
  // babel transpiles this too Foo.prototype.canMock
  protoMethod () {
    // will be mocked
  }

  // this becomes an instance property
  instanceMethod = () => {
    return 'NOT be mocked'
  }

  render () {
    return (<div>{`${this.protoMethod()} ${this.instanceMethod()}`}</div>)
  }
}

Foo.prototype.protoMethod = jest.fn().mockReturnValue('you shall')

it('should be mocked', () => {
  const mock = jest.fn().mockReturnValue('be mocked')
  const wrapper = mount(<Foo />)
  wrapper.instance().instanceMethod = mock
  wrapper.update()
  expect(mock).toHaveBeenCalled()
})

Однако обратите внимание, что это не работает при использовании shallow вместо mount.

person jorrebor    schedule 25.11.2017
comment
это не сработало для меня, я использую создание реакции и фермент-адаптер-реагирование-16 - person manas; 12.12.2018
comment
тест завершился неудачно с ожидаемым вызовом фиктивной функции, но она не была вызвана. - person manas; 12.12.2018

Вы ничего не упускаете.

Jest может только имитировать структуру объектов, которые присутствуют в требуемое время. Он делает это путем отражения (а не анализа), что означает, что свойства, добавляемые конструктором, не могут быть имитированы. Однако важно понимать, что назначение жирной стрелки в классе в JS не является методом класса; это свойство класса, содержащее ссылку на функцию.

https://github.com/facebook/jest/issues/6065

person Leftwing    schedule 22.07.2019