【问题标题】:React Testing Library: Objects are not valid as a React childReact 测试库:对象作为 React 子级无效
【发布时间】:2020-07-08 22:46:24
【问题描述】:

我正在尝试使用 jest 编写测试,但遇到了这个错误

Objects are not valid as a React child (found: [object Promise]). If you meant to render a collection of children, use an array instead.
        in td (created by TableCell)
        in TableCell (created by DataTable)
        in tr (created by TableExpandRow)
        in TableExpandRow (created by DataTable)
        in tbody (created by TableBody)
        in TableBody (created by DataTable)
        in table (created by Table)
        in Table (created by DataTable)
        in div (created by DataTable)
        in div (created by TableContainer)
        in TableContainer (created by DataTable)
        in div (created by DataTable)
        in DataTable
        in Unknown
        in Unknown (created by EnhancedDataTable)
        in EnhancedDataTable (created by MyPage)
        in div (created by MyPage)
        in MyPage


  27 | 
  28 |     it('renders', () => {
> 29 |         const { container } = render(<MyPage />);

MyPage 是一个返回函数的组件

<React.Fragment>
    <MyHeader title={'Page Header'} />
    <div className="page-content">
        <EnhancedDataTable
            actions={actions}
            rowActions={rowActions}
            headers={rowHeaders}
            rowDetail={rowDetail}
            rows={rowsData}
            className='my-table'
        />
    </div>
</React.Fragment>

我在这里错过了什么?

【问题讨论】:

    标签: reactjs jestjs react-testing-library


    【解决方案1】:

    您正试图将一个对象(promise)渲染为一个孩子。从您的代码中很难知道在哪里,但是,假设您的表像 rc-components 表一样工作,它可能是这样的:

    假设我有一个数组并想将它渲染到一个表中

    const arr = [
      {
        company: 'XYZ',
        owner: {
          name: 'Julius'
        }
      }
    ]
    

    现在,我想将它呈现在一个带有列的表中:|公司| owner |,所以我创建了一个 headers 数组:

    const arr = [
      {
        dataIndex: 'company'
      },
      {
        dataIndex: 'owner'
      }
    ]
    

    现在,这不起作用,因为我的表将尝试渲染对象{name: 'Julius'},并且对象作为反应子级无效。

    解决方法是将我的标题更改为:

    const arr = [
      {
        dataIndex: 'company'
      },
      {
        dataIndex: ['owner', 'name']
      }
    ]
    

    现在它应该可以工作了,因为列将是row['owner']['name'],一个字符串。

    如果没有更多代码,很难准确判断问题出在哪里,但希望该示例能够让您了解 react 对该错误的含义。我所知道的是错误出现在表格的单元格中,因为堆栈显示in Unknown (created by EnhancedDataTable),最后一个(或第一个,我猜)项目是td,这是表格数据的一个常见元素。

    【讨论】:

    • 你应该检查rowsData,因为它很可能是你的表中唯一直接呈现某些东西并且应该呈现为td的东西。
    • 傻我,你是对的!我使用的是const [rowsData, setRowsData] = useState(null); 而不是const [rowsData, setRowsData] = useState([]);。改null ==> []后,测试通过
    • 哎呀对不起,我匆忙意识到我已经评论了导致通过测试的测试代码。但问题仍然存在。
    • 它应该仍然是数据的问题,我猜你是从各种外部 api 加载它,但没有等待返回,比如:setRowsData(api.get('/data')) 什么时候应该是setRowsData(await api.get('/data'))。那个或行中的对象在其中都有一个承诺。通过将rows={rowsData} 更改为rows={[]} 并在MyPage 的return 语句之前放置一个console.log(rowsData),这两者都应该很容易发现
    • 您还可以从MyPage 发布更多代码,如果我是这样,headers 以及与行数据有关的任何事情都应该有所帮助。也是您希望在行内接收数据的类型。
    猜你喜欢
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 2019-08-18
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 2018-05-27
    相关资源
    最近更新 更多