【发布时间】:2019-10-05 03:01:15
【问题描述】:
我有一个包含输入和按钮的组件。当用户在输入中键入爱好时,假设将该字符串发送到 API 进行更新。我已经设置了我的测试并且我正在测试组件是否存在并且我收到错误 TypeError: Cannot read property 'map' of undefined, 当我 console.log(component)。它表示组件未定义。
当我注释掉 {this.state.hobbies.map()} 部分(包括第二个渲染和其中的所有内容)时,组件能够渲染。
EditProfile.js
import React, { Component } from 'react';
import { MdDelete } from 'react-icons/md';
import { updateHobbies } from '../../services/updateHobbies';
import './edit_profile.scss';
import PropTypes from 'prop-types';
class EditProfile extends Component {
state = {
hobbies: this.props.employeeHobbies,
userInput: ''
};
handleChange = e => {
this.setState({ userInput: e.target.value });
};
handleButtonClick = () => {
const hobby = this.state.hobbies.concat(this.state.userInput);
this.setState({ hobbies: hobby, userInput: '' }, () =>
updateHobbies(this.state.hobbies));
};
handleDelete = e => {
const array = [...this.state.hobbies];
const index = array.indexOf(e);
if (index !== -1) {
array.splice(index, 1);
this.setState({ hobbies: array }, () =>
updateHobbies(this.state.hobbies));
}
};
render() {
return (
<div>
<label className='employee-label'>HOBBIES: </label>
<span>
<input type='text' value={this.state.userInput} onChange=
{this.handleChange} />
<button className='update-details-button' onClick=
{this.handleButtonClick}>
Add
</button>
{this.state.hobbies.map(hobbies => {
return (
<li className='employee-tag-list' key={hobbies}>
{hobbies}
<span className='delete-icons' onClick={() =>
this.handleDelete(hobbies)}>
<MdDelete />
</span>
</li>
);
})}
</span>
</div>
);
}
}
EditProfile.propTypes = {
employeeHobbies: PropTypes.array
};
export default EditProfile;
EditProfile.test.js
let component;
const chance = new Chance();
let mockHandleChange = jest.fn();
let mockHandleButtonClick = jest.fn();
let mockHandleDelete = jest.fn();
let mockUpdateHobbies;
let mockHobbies = [chance.string(), chance.string(), chance.string()];
function requiredProps(overrides = {}) {
return {
handleChange: mockHandleChange,
handleButtonClick: mockHandleButtonClick,
handleDelete: mockHandleDelete,
...overrides
};
}
function renderComponent(props = requiredProps()) {
return shallow(<Hobbies {...props} />);
}
beforeEach(() => {
component = renderComponent();
});
it('should exist', () => {
console.log(component.debug());
expect(component).toHaveLength(1);
});
我希望测试通过,但我收到错误,TypeError: Cannot read property 'map' of undefined
【问题讨论】:
-
请添加
EditProfile.js的其余部分。我怀疑这是因为您没有正确初始化状态属性(在这种情况下,state.hobbies没有设置为空数组)。 -
我刚刚更新了代码
-
将默认的空数组设置为
emloyeeHobbies。EditProfile.defaultProps = { employeeHobbies: [] }; -
state = { 爱好:this.props.employeeHobbies, userInput: '', employeeHobbies: [] };这是你要我做的吗?
标签: reactjs unit-testing jestjs