【问题标题】:Testing react component - TypeError: data.map is not a function测试反应组件 - TypeError: data.map is not a function
【发布时间】:2017-09-22 04:09:46
【问题描述】:

我有一个反应组件,它接受一个对象数组并将它们映射到视图中的另一个反应组件。 我在测试它时运气不好,因为它给出了这个错误:

TypeError: data.map 不是函数

这是我写的测试。请注意我传递了我认为应该使它工作的数据道具?

content.test.js

import React from 'react';
import { shallow, mount } from 'enzyme';
import { expect } from 'chai';

import Content from '../components/Content.jsx';

describe('<Content />', () => {
  const data = {
    created: '2017-02-21T09:50:21.441815Z',
    duration: 1575,
    final_script: 'some script',
    language: 'en-GB',
    rating: 2,
    url: 'some url',
  };
  it('renders without exploding', () => {
    mount(<Content data={ data } />);
  });
});

这里是组件本身

content.jsx

function Content(props) {
  const { data } = props;
  return (
    <div className='content_container'>
      {
        data.map((content, index) => <AudioBox data={ content } key={ 
index } />)
      }
    </div>
  );
}

Content.propTypes = {
  data: React.PropTypes.arrayOf(React.PropTypes.object),
};

export default Content;

这是调用此内容组件的组件

home.jsx

class Home extends Component {
  constructor(props) {
    super(props);
    this.state = {
      content: null,
    };
    this.logout = this.logout.bind(this);
  }

  componentDidMount() {
    const token = localStorage.getItem('i2x_token');
    const requestURL = API_CONTENT;
    const requestObj = {
      method: 'GET',
      headers: new Headers({
        Authorization: `JWT ${token}`,
      }),
    };
    request(requestURL, requestObj).then((reply) => {
      if (reply.results.length > 0) {
        this.setState({ content: reply.results });
      } else {
        console.log('no reply from API');
      }
    });
  }

  logout() {
    localStorage.removeItem('i2x_token');
    browserHistory.push('/');
  }

  render() {
    const data = this.state.content;
    return (
      <div className='container'>
        <Header logout={ this.logout } />
        { data !== null &&
        <Content data={ this.state.content } />
        }
      </div>
    );
  }
}

export default Home;

这里有什么问题?

【问题讨论】:

    标签: reactjs sinon chai jestjs enzyme


    【解决方案1】:

    我认为您设置的data 不是array,因此您会收到错误消息。

    检查一下:

    let data = {};
    
    data.map(el => console.log(el))

    确保数据应该是一个数组,您也可以在使用map by Array.isArray 之前进行检查,如下所示:

    Array.isArray(data) && data.map((content, index) => <AudioBox data={content} key={index} />
    

    试试这个:

    以这种方式定义数据:

    const data = [
         {
            created: '2017-02-21T09:50:21.441815Z',
            duration: 1575,
            final_script: 'some script',
            language: 'en-GB',
            rating: 2,
            url: 'some url',
        }
    ];
    

    【讨论】:

    • 谢谢!你是对的数据不是一个数组。傻我!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    • 2019-03-22
    • 1970-01-01
    • 2021-04-19
    • 2019-02-08
    • 1970-01-01
    相关资源
    最近更新 更多