Тестовый компонент использует пользовательскую ловушку реагировать на тестирование библиотеки - PullRequest
0 голосов
/ 17 февраля 2020

Я использую реагирующую библиотеку для тестирования моего компонента с помощью пользовательского хука. Но я не могу пройти мимо. Вот мой код

function useInput<T>(): Return<T> {
    const [input, setInput] = useState<T>({} as T);
    const [isDirty, setDirty] = useState({} as Record<keyof T, boolean>);

    const handleInputChange = (e: ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
        setInput({
            ...input,
            [e.target.name]: e.target.value
        });
        setDirty({
            ...isDirty,
            [e.target.name]: true
        });
    };

    const resetInput = () => {
        Object.keys(input).map((v) => (input[v as keyof T] as unknown as string) = '');
        Object.keys(isDirty).map((v) => (isDirty[v as keyof T] as unknown as string) = '');
        setInput({...input});
        setDirty({...isDirty});
    };

    return [input, handleInputChange, isDirty, resetInput, setInput]
}

const Login: React.FC = () => {
    const [input, handleChangeInput, isDirty, resetInput] = useInput<IInput>();

    return (
                <input
                    value={input.username}
                    onChange={handleChangeInput}
                    name={'username'}
                    className={classNames(`shadow appearance-none border rounded w-full py-2 px-3 text-gray-700 mb-3 leading-tight focus:outline-none focus:shadow-outline`)}
                    id={'username'} type={'text'} placeholder={'Username'}/>

    )
}

test

import React from "react";
import {render, unmountComponentAtNode} from "react-dom";
import Login from './index'
import {renderHook, act as actHook} from '@testing-library/react-hooks'
import {MemoryRouter} from "react-router-dom";
import {useInput} from '../hooks';
import { fireEvent } from '@testing-library/react';


describe('test login', () => {
  it('to match snapshot', () => {
    render(
      <MemoryRouter>
        <Login/>
      </MemoryRouter>
      ,
      container);
    expect(container).toMatchSnapshot()
  });

  it('input correct when change username',  () => { //can't pass
     render(
      <MemoryRouter>
        <Login/>
      </MemoryRouter>
      ,
      container);

    const {result} = renderHook(() => useInput());
    const [input, handleChangeInput] = result.current;
    const inputName = container.querySelector('#username');
    fireEvent.change(inputName, {target: {value: 'test'}});

    actHook(() => {
      handleChangeInput({target: {name: 'username', value: 'test'}});
    });
    expect(input).toBe({
      username: 'test'
    })

  })
});

Мой сценарий теста. При входном вызове fireEvent, значение изменения ввода и значение в хуке useInput имеют одинаковое значение. Но я могу сделать это. Где моя ошибка? Пожалуйста, помогите

1 Ответ

1 голос
/ 01 апреля 2020

Библиотека тестирования React-хуков была создана для тестирования хуков без необходимости монтировать ее на тестовом компоненте. Вы должны решить либо протестировать саму ловушку (без использования вашего компонента Login), либо весь ваш компонент в целом - тогда вам вообще не нужна библиотека для тестирования ловушек - ответной библиотеки-тестирования должно быть достаточно. Ваш fireEvent фактически "выстреливает" ваш крюк без детали ниже

const {result} = renderHook(() => useInput());
const [input, handleChangeInput] = result.current;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...