не может имитировать функцию в useEffect, когда toMatchSnapshot в шутку

#reactjs #jestjs #react-hooks #use-effect

#reactjs #jestjs #реагирующие хуки #использование-эффект

Вопрос:

Я пытаюсь получить весь снимок на моем LayoutDummy.js чтобы завершить покрытие моего модульного тестирования

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

введите описание изображения здесь

Я написал свой фактический код в функциональном компоненте и файле тестирования следующим образом

LayoutDummy.js

 import React, { useEffect, useState } from 'react';

const LayoutDummy = () => {
  const [caption, setCaption] = useState('loading...');
  useEffect(() => {
    dummyFunc();
  }, []);

  const dummyFunc = () => {
    setCaption('dummyFunc is running');
  };
  return (
    <div>
      <p>LayoutDummy</p>
      <p>{caption}</p>
    </div>
  );
};

export default LayoutDummy;

  

test/LayoutDummy.js

 import React, { useEffect } from 'react';
import ShallowRenderer from 'react-test-renderer/shallow';
import LayoutDummy from '../LayoutDummy';


const dummyFunc = jest.fn();

useEffect.mockImplementationOnce(fn => fn());

describe('mock func in useEffct', () => {

  test('render', () => {
    const shallow = new ShallowRenderer();
    const tree = shallow.render(<LayoutDummy />);
    dummyFunc.mockReturnValueOnce('dummyFunc is running');
    expect(tree).toMatchSnapshot();
  });
});

  

Почему функция не может имитироваться в моем модульном тестировании, пожалуйста, если есть какие-либо предложения, чтобы пройти тест со всеми снимками.

Ответ №1:

Проблема специфична для React test renderer, а не toMatchSnapshot

dummyFunc невозможно издеваться. dummyFunc переменная является локальной для LayoutDummy области действия функции. Доступ к локальным переменным невозможен за пределами области, в которой они были определены.

Тест завершается неудачно, потому useEffect что работает по-другому в тестовом рендерере, а не в рендере DOM. Обычно useEffect обратный вызов вызывается после первоначального рендеринга, но в тестах он вызывается сразу перед оценкой const dummyFunc строки. Нет причин специально размещать эту строку после useEffect . Чтобы не вызывать проблем в тестах, его следует отменить:

   const [caption, setCaption] = useState('loading...');

  const dummyFunc = () => {
    setCaption('dummyFunc is running');
  };

  useEffect(() => {
    dummyFunc();
  }, []);