【问题标题】:How to unit test a function that return JSX.element?如何对返回 JSX.element 的函数进行单元测试?
【发布时间】:2020-09-28 22:03:57
【问题描述】:

我有一个接受参数并返回JSX.Element的函数

//title.tsx
export const getTitle = (pageTitle: string) => {
    return <title> {pageTitle} </title>;
}

这就是我测试它的方式:

describe('Title component', () => {    
    test("Title component is rendered", () => {
        const wrapper = getTitle('abc');
        const expectedText = `abc`;
        const actualText = wrapper; //wrapper.text() does not exists;
        expect(actualText).toContain(expectedText);
    });
});

测试失败,输出如下:

Expected value: "abc"
Received object: <React.Fragment><title>abc</title></React.Fragment>

根据一些研究,我在 Google 上找到了一个解决方案,它假定函数是类组件的一部分。该解决方案要求wrapperreturned by shallow while passing the class-based component ControlledForm)。这不适用于我的情况。

如何从函数返回的JSX.element中提取文本值与一些预期的文本进行比较?

或者有其他方法可以测试这种情况吗?

【问题讨论】:

  • 我开始为您编写答案,但意识到编写正确的测试并没有解决您的核心问题。我会在这部分工作。同时,让我们弄清楚一些术语:getTitle() 是一个返回 JSX 的函数,但它不是一个函数式组件。功能组件必须将单个 JavaScript 对象作为其唯一参数。传统上我们将此参数称为props。主要区别在于,如果您将 &lt;getTitle&gt; 正确地编写为功能组件,则不能将其用作 JSX 标记。相反,您必须直接致电getTitle()
  • @Code-Apprentice 感谢指正!

标签: javascript reactjs typescript unit-testing tdd


【解决方案1】:

去找道具或使用另一个浅滩。我不知道哪个是红色药丸。

const titleName = "titleName";
const wrapper = shallow(getTitle(titleName));
const titleElement = wrapper.getElement("title");
titleElement.props.children[1] // "titleName" as [0] and [2] are " "
const containsTitle = titleElement.props.children.includes(titleName);
expect(containsTitle).toBe(true);

const titleName = "titleName";
const wrapper = shallow(getTitle(titleName));
const titleElement = wrapper.getElement("title");
const secondWrapper = shallow(titleElement);
secondWrapper.text() // "titleName"
const containsTitle = secondWrapper.contains(titleName);
expect(containsTitle).toBe(true);

【讨论】:

  • 你能详细说明你答案的道具部分吗?请...
  • 你是说第一个?当您将 JSX 包装在 JSX 中时,将放入 props.children
  • ReactShallowRenderer render():浅渲染仅适用于自定义组件,但提供的元素类型为symbol
  • @ZameerAnsari 你能建议你是如何解决这个问题的吗?我也面临着完全相同的问题。测试返回另一个子组件或 jsx 的反应组件。
猜你喜欢
  • 1970-01-01
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 2021-09-07
相关资源
最近更新 更多