Jest шпион по функциональности

Я перебираюсь, чтобы шутить от мокко, и мне интересно, есть ли способ подсмотреть метод реагирования. Например, скажем, у меня есть следующий метод в моем компоненте (Игнорируйте библиотеку sdk, он просто конструирует вызов jQuery ajax):

    getData() {
    sdk.getJSON('/someURL').done(data => {
        this.setState({data});
    });
}

Используя синус, я бы проверил это, шпионируя по прототипу, например:

 it('should call getData', () => {
        sinon.spy(Component.prototype, 'getData');
        mount(<Component />);
        expect(Component.prototype.getData.calledOnce).to.be.true;
    });

это обеспечило бы покрытие кода без издевательства над этим методом. Есть ли подобная функциональность в шутке?

EDIT: Кроме того, если эта функция не существует, какова следующая лучшая стратегия тестирования вызовов API?

Ответ 1

Есть метод spyOn, который был представлен с v19 несколько дней назад, который делает именно то, что вы ищете

Ответ 2

На самом деле вы можете использовать jest.spyOn jest.spyOn

Если метод вызывается при создании компонента, используйте:

import { mount } from 'enzyme'; 

describe('My component', () => {
  it('should call getData', () => {
    const spy = jest.spyOn(Component.prototype, 'getData');
    mount(<Component />);
    expect(Component.prototype.getData).toHaveBeenCalledTimes(1)
  });
})

или если у вас есть это в вашем DOM и методе bind, вы можете использовать:

import { shallow } from 'enzyme'; 

describe('My component', () => {
  it('should call getData', () => {
    const wrapper = shallow(<Component />);
    const instance = wrapper.instance()
    const spy = jest.spyOn(instance, 'getData');
    wrapper.find('button').simulate('click')
    expect(spy).toHaveBeenCalledTimes(1)
  });
})

Ответ 3

Вы можете перейти к новому методу spyOn, а следующее должно работать нормально.

it('should call getData', () => {
    Component.prototype.getData = jest.fn(Component.prototype.getData);
    expect(Component.prototype.getData).toBeCalled();
});

Ответ 4

Я использую Jest с React 16.8 - это сработало для меня:

  it("lifecycle method should have been called", () => {
    jest.spyOn(RedirectingOverlay.prototype, 'componentWillUnmount');
    jest.spyOn(RedirectingOverlay.prototype, 'componentDidMount');
    const wrapper = mount(<RedirectingOverlay message="Hi There!"/>);
    expect(RedirectingOverlay.prototype.componentDidMount).toHaveBeenCalledTimes(1)
    wrapper.unmount()
    expect(RedirectingOverlay.prototype.componentWillUnmount).toHaveBeenCalledTimes(1)
  })

Также используя:

  • "enzyme": "^3.6.0"
  • "jest": "23.5.0"
  • "enzyme-adapter-react-16": "^1.5.0"