Ошибка типа: Не удается прочитать свойство «значение» неопределенного фермента шутки

#javascript #reactjs #jestjs #enzyme

Вопрос:

Ниже приведен мой компонент.

 import React, { useState, useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';

import { postJobAction } from './redux/postJobActions';

const PostJobComponent = () => {
  const dispatch = useDispatch();

  const onPostJobSubmit = (event) => {
    event.preventDefault();
    const title = event.target.title.value;
    const location = event.target.location.value; // Here is the error.

    dispatch(postJobAction({
      title,
      location,
    }));
  };

  return (
    <div className='post-job'>
      <form onSubmit={onPostJobSubmit}>
        <div>
          <label>Job Title</label>
          <input
            type='text'
            name='title'
            defaultValue=''
            className='job__title'
            placeholder='e.g. Frontend Developer, Project Manager etc.'
          />
        </div>
        <div>
          <label>Job Location</label>
          <input
            type='text'
            name='location'
            defaultValue=''
            className='job__location'
            placeholder='e.g. Berlin, Germany.'
          />
        </div>
        <div>
          <button>Save</button>
        </div>
      </form>
    </div>
  );
};

export default PostJobComponent;

 

Вот тестовый пример.

 it('should submit job post form on save button click', () => {
        const onPostJobSubmit = jest.fn();
        const instance = wrapper.instance();
        wrapper.find('form').simulate('submit');
        expect(onPostJobSubmit).toHaveBeenCalled();
    });
 

Когда я запускаю тест, я получаю ошибку ниже.

     TypeError: Cannot read property 'value' of undefined

      22 |     const title = event.target.title.value;
    > 23 |     const location = event.target.location.value;
 

Чего мне не хватает и как это исправить?

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

1. @DrewReese Я использую React 17.0.2 .

2. @DrewReese это не определено.

3. Ах, хорошо, спасибо, что проверили. Я действительно не вижу явной проблемы с компонентом формы. Только ли в тесте он выдает ошибку?

Ответ №1:

Как отмечается в .simulate документации

Как отмечено в подписи функции выше, передача фиктивного события необязательна. Имейте в виду, что если код, который вы тестируете, использует событие для чего-то вроде вызова event.preventDefault() или доступа к любому из его свойств, вы должны предоставить объекту фиктивного события свойства, необходимые вашему коду.

попробуйте добавить макет объекта события, как это:

 it('should submit job post form on save button click', () => {
    const onPostJobSubmit = jest.fn();
    const instance = wrapper.instance();
    wrapper.find('form').simulate('submit', {
      target: {
        title: {
          value: 'some value',
        },
        location: {
          value: 'some value'
        }
      }
    });
    expect(onPostJobSubmit).toHaveBeenCalled();
});
 

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

1. Я внес эти изменения, но теперь я получаю еще одну ошибку. Я обновил вопрос с новой ошибкой. Не могли бы вы, пожалуйста, взглянуть и помочь?

2. @Om3ga вы определяете функцию в рамках теста, и компонент не получает ссылку на нее, поэтому вы не должны ожидать, что она будет вызвана, даже если у нее то же имя, что и у компонента из области действия.

3. @Om3ga вам лучше проверить, как протестировать издевательское хранилище или была ли вызвана отправка с ожидаемыми данными

4. ни одна отправка не вызывается со всеми данными.

5. Тест должен проверять, был ли он вызван с помощью того, с чем компонент должен был его вызывать