#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. Тест должен проверять, был ли он вызван с помощью того, с чем компонент должен был его вызывать