Шутка: как протестировать функцию, определенную с помощью «экспортной функции»?

#reactjs #unit-testing #jestjs #enzyme

Вопрос:

У меня есть функция, определенная следующим образом:

 import React, { useState } from 'react';

export function TestFunc(props) {
  const [var1, setVar1] = useState(undefined);
  const functionA = (a, b) => {
    return a   b;
  };
};
 

Теперь я хотел бы провести модульный тест functionA , я попробовал следующий синтаксис, но он не сработал:

 import * as TestFunc from './TestFunc';
describe('test test function', () => {
  test('function A', () => {
    expect(TestFunc.functionA(2, 3)).toBe(5);
  });
});
 

Каков правильный синтаксис для TestFunc.functionA работы?

Ответ №1:

functionA в настоящее время является частным для TestFunc . Реорганизуйте свой код таким образом, чтобы вы экспортировали functionA , т. е.

 import React, { useState } from 'react';

export const functionA = (a, b) => (a   b);

export function TestFunc(props) {
  const [var1, setVar1] = useState(undefined);
};
 

Как только вы это сделаете, вы сможете протестировать functionA , например

 import { functionA } from './TestFunc';
describe('test functionA', () => {
  test('that is behaves as expected', () => {
    expect(functionA(2, 3)).toBe(5);
  });
});
 

Комментарии:

1. Нет, я не смогу так переработать код, я не владею кодом, я только тестирую его.

2. О, хорошо. В этом случае вы застряли, так как функция фактически не вызывается внутри TestFunc, она просто определена.

3. спасибо за ваш ответ, мне нужно обсудить это с автором кода.

4. Я еще раз взглянул на код, functionA который на самом деле был определен как const functionA = (props.a, props.b) => {return props.a props.b} . В этом случае я не смогу провести рефакторинг кода, верно?

5. не могу экспортировать две вещи одновременно, нужно использовать {function ,TestFunc}

Ответ №2:

попробуйте выполнить mount эту функцию, а затем попробуйте вызвать функцию,

   it('function A', () => {
    const wrapper = mount(<TestFunc />);
    expect(wrapper.find('functionA ')).toHaveLength(1);
  });