微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么react-test-renderer在React中只能在同一个文件中findByType功能组件?

如何解决为什么react-test-renderer在React中只能在同一个文件中findByType功能组件?

这是我正在测试的功能组件 some-table.jsx

import React from 'react';

const SoMetable = ({ somethings }) => (
  <>
    {somethings.map(something => {
      return <SomeRow key={something} something={something} />
    })}
  </>
);

export const SomeRow = ({ something }) => {
  return <p>{something}</p>
}

export default SoMetable;

这是我的测试文件

import { create } from "react-test-renderer";
import SoMetable,{ SomeRow } from "../common/ui/some-table";

test("check SoMetable has row",() => {
  const renderer = create(<SoMetable somethings={["Hello","World"]} />);
  const allRows = renderer.root.findAllByType(SomeRow);
  expect(allRows.length).toBe(2);
});

此测试通过。但是,如果我将 SomeRow 移动到它自己的文件中,它就会失败:

some-table.jsx

import React from 'react';
import { SomeRow } from './some-row';

const SoMetable = ({ somethings }) => (
  <>
    {somethings.map(something => {
      return <SomeRow key={something} something={something} />
    })}
  </>
);

export default SoMetable;

some-row.jsx

import React from 'react';

export const SomeRow = ({ something }) => {
  return <p>{something}</p>
}

失败:

expect(received).toBe(expected) // Object.is equality

Expected: 2
Received: 0

有什么想法可能是这样吗?感谢阅读。

解决方法

在创建这些 Some... 测试文件以解决的实际场景中,问题是由 React 的 memo() 函数引起的:

import React,{ memo } from 'react';
...
export default memo(SomeRow);

一种解决方法如下:

const allRows = renderer.root.findAllByType(SomeRow.type);

支持 bensampaio for that tip。您还会发现许多其他讨论 on that link 可能对您有帮助,包括:

reactreact-domreact-test-renderer 固定到 16.11.0,最重要的是向 react-is@16.11.0 添加依赖项,或使用如下所示的谓词:

const elementByType = (type) => (element) => (
    element.type === type // Match non-memo'd
    || element.type === type.type // Match memo'd
);

还应该指出的是,我也做了一些愚蠢的事情。进口是错误的。这:

import SomeTable,{ SomeRow } from "../common/ui/some-table";

应该是这样的:

import SomeTable from "../common/ui/some-table";
import { SomeRow } from "../common/ui/some-row";

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。