Глобально макет функции в Jest / Фермент в React - PullRequest
1 голос
/ 22 марта 2019

Часто у меня есть функции, которые импортируются в компонент React, который я хочу протестировать, используя jest / энзим.

Обычно я могу получить доступ к функции, определенной в компоненте, через wrapper.instance (). FunctionName, а затем проверить, была ли вызвана функция.Точно так же я могу передать фиктивную функцию в качестве подпорки при монтировании компонента в тесте, а затем проверить, был ли вызван этот компонент.Однако у меня нет методов тестирования функций, которые импортируются в компоненты (не определены внутренне или как подпорки).

Есть ли способ использовать jest / энзим для определения глобальной фиктивной функции, которая будет использоваться в тесте компонента, который переопределит реализацию функции с тем же именем, которая была импортирована в компоненттестирование?

1 Ответ

1 голос
/ 22 марта 2019

Да, это возможно.

Существует множество различных способов макетирования модулей или отдельных функций внутри модулей.


Вот один пример:

lib.js

export const importedFunc = () => 'original';

code.js

import * as React from 'react';
import { importedFunc } from './lib';

export class SimpleComponent extends React.Component {
  render() {
    return (<div>{ importedFunc() }</div>);
  }
}

code.test.js

import * as React from 'react';
import { shallow } from 'enzyme';
import * as lib from './lib';
import { SimpleComponent } from './code';

test('SimpleComponent', () => {
  const spy = jest.spyOn(lib, 'importedFunc');
  spy.mockReturnValue('mocked');
  const wrapper = shallow(<SimpleComponent />);
  expect(wrapper.html()).toBe('<div>mocked</div>');  // Success!
  expect(spy).toHaveBeenCalled();  // Success!
});

jest.spyOn оборачивает функцию в шпионе, и вы можете изменить поведение шпиона с помощью любого из его методов , таких как mockReturnValue, mockImplementation и т. Д.

jest.mock позволяет макетировать весь модуль.

Ручные макеты позволяют создавать модульные макеты, которые можно использовать в тестах.

...