10

我是单元测试的新手,我正在尝试渲染一个组件以了解有关该库的更多信息。

我正在尝试遵循指南。

零件

<TouchableOpacity
    style={style}
    onPress={onPress}
    accessibilityRole="button"
>
    <AppText style={textStyle}>{title.toUpperCase()}</AppText>
</TouchableOpacity> 

测试

it("Has the correct title in the button", () => {
    const { getByText } = render(<AppButton title="Hello" />);
  
    expect(getByText("HELLO")).toBeInTheDocument();
});

我只是想查看组件是否正确呈现,但出现错误

received value must be an HTMLElement or an SVGElement.
    Received has type:  object
    Received has value: {"_fiber": {"_debugHookTypes": null, "_debugID": 40, "_debugIsCurrentlyTiming": false, "_debugNeedsRemount": false, "_debugOwner": [FiberNode], "_debugSource": null, "actualDuration": 0, "actualStartTime": -1, "alternate": null, "child": [FiberNode], "childExpirationTime": 0, "dependencies": null, "effectTag": 1, "elementType": [Function Component], "expirationTime": 0, "firstEffect": null, "index": 0, "key": null, "lastEffect": null, "memoizedProps": [Object], "memoizedState": null, "mode": 0, "nextEffect": null, "pendingProps": [Object], "ref": null, "return": [FiberNode], "selfBaseDuration": 0, "sibling": null, "stateNode": [Component], "tag": 1, "treeBaseDuration": 0, "type": [Function Component], "updateQueue": [Object]}}

关于我做错了什么有什么建议吗?

4

3 回答 3

4

您可以使用waitFor

样本:

import { waitFor } from "@testing-library/react-native";


waitFor(() => expect(getByText("Your-text")).toBeInTheDocument());

// or

waitFor(() => expect(getByTestId("Your-Test-Id")).toBeInTheDocument());
于 2021-11-08T10:13:59.793 回答
3

问题是您正在尝试使用React Native 代码中的toBeInTheDocument辅助函数。期望将 DOM 元素传递给它的函数,并且打算与它一起使用- 它不适用于 React Native 的原生元素。@testing-library/jest-dom@testing-library/jest-dom@testing-library/react

使用时,@testing-library/react-native您可以像这样断言元素的存在。

it("has the correct title in the button", () => {
    const { getByText } = render(<AppButton title="Hello" />);
    expect(getByText("HELLO")).toBeTruthy();
});
于 2021-11-08T23:21:56.730 回答
-1

Here is the working solution, it works if I access by testID.

it("Has the correct title in the button", () => {
        const { getByTestId } = render(<AppButton title="Hello" />);
        const eins = getByTestId("text");
        expect(eins.children[0]).toEqual("HELLO");
});

Although it'd have been good to understand why I couldn't get the value with getByText, at least it's working. :)

于 2021-03-08T09:00:08.610 回答