无法使用 react-native-testing-library 找到命名元素
Can't find named elements with react-native-testing-library
我试图通过其占位符文本获取元素,但 react-native-testing-library 不断向我抛出相同的错误:
expect(received).toEqual(expected) // deep equality
Expected: "Cirurgião"
Received: {"_fiber": {"_debugHookTypes": null, "_debugID": 451, "_debugIsCurrentlyTiming":
false, "_debugNeedsRemount": false, "_debugOwner": [FiberNode], "_debugSource": [Object],
"actualDuration": 0, "actualStartTime": -1, "alternate": null, "child": [FiberNode],
"childExpirationTime": 0, "dependencies": null, "effectTag": 129, "elementType": [Function
Component], "expirationTime": 0, "firstEffect": null, "index": 0, "key": null, "lastEffect":
null, "memoizedProps": [Object], "memoizedState": null, "mode": 0, "nextEffect": null,
"pendingProps": [Object], "ref": [Function ref], "return": [FiberNode], "selfBaseDuration": 0,
"sibling": null, "stateNode": [Component], "tag": 1, "treeBaseDuration": 0, "type": [Function
Component], "updateQueue": null}}
这是我要测试的代码:
const { getByTestId, queryByTestId, getByPlaceholderText} = render(
<Input placeholder="Cirurgião"
testID='input_buscaCirurgiao_index'
value={mockValue}
autoCorrect={false}
keyboardType={(Platform.OS === 'android') ? 'visible-password' : 'default'}
onChangeText={mockState}
onSubmitEditing={mockState}
autoCapitalize='none' />
);
expect(getByPlaceholderText('Cirurgião')).toEqual('Cirurgião');
我也尝试通过 getByTestId 和 queryByTestId 获取我要测试的元素,但两者都有类似的错误。
如果我尝试使用 waitFor() => 进行测试,我不会收到任何错误消息,即使我尝试更改预期输出,如 expect(getByTestId('test1').toEqual('test2');.
它运行流畅,但不应该。
我不确定我做错了什么。
getByPlaceholderText
returns你first matching node。实际上,它成功地做到了这一点。该节点表示为 一个对象 并且您的测试显示
Expected: "Cirurgião"
Received: {"_fiber": { //<- Here you actually received an object representing the node
发生这种情况是因为您希望对象节点等于字符串(字符串!=节点):
.toEqual('Cirurgião');
您可能想要测试两种可能的情况:
- 组件实际上 there/is 正在渲染吗?
- 视图是否包含我期望的占位符?
要测试第一个,您只需执行以下操作:
getByPlaceholderText('Cirurgião')
如果渲染树中没有组件,它会抛出异常,因此您的测试将失败。
测试第二个将是:
const input = getByPlaceholderText('Cirurgião');
expect(input.props.placeholder).toBe('Cirurgião');
我试图通过其占位符文本获取元素,但 react-native-testing-library 不断向我抛出相同的错误:
expect(received).toEqual(expected) // deep equality
Expected: "Cirurgião"
Received: {"_fiber": {"_debugHookTypes": null, "_debugID": 451, "_debugIsCurrentlyTiming":
false, "_debugNeedsRemount": false, "_debugOwner": [FiberNode], "_debugSource": [Object],
"actualDuration": 0, "actualStartTime": -1, "alternate": null, "child": [FiberNode],
"childExpirationTime": 0, "dependencies": null, "effectTag": 129, "elementType": [Function
Component], "expirationTime": 0, "firstEffect": null, "index": 0, "key": null, "lastEffect":
null, "memoizedProps": [Object], "memoizedState": null, "mode": 0, "nextEffect": null,
"pendingProps": [Object], "ref": [Function ref], "return": [FiberNode], "selfBaseDuration": 0,
"sibling": null, "stateNode": [Component], "tag": 1, "treeBaseDuration": 0, "type": [Function
Component], "updateQueue": null}}
这是我要测试的代码:
const { getByTestId, queryByTestId, getByPlaceholderText} = render(
<Input placeholder="Cirurgião"
testID='input_buscaCirurgiao_index'
value={mockValue}
autoCorrect={false}
keyboardType={(Platform.OS === 'android') ? 'visible-password' : 'default'}
onChangeText={mockState}
onSubmitEditing={mockState}
autoCapitalize='none' />
);
expect(getByPlaceholderText('Cirurgião')).toEqual('Cirurgião');
我也尝试通过 getByTestId 和 queryByTestId 获取我要测试的元素,但两者都有类似的错误。
如果我尝试使用 waitFor() => 进行测试,我不会收到任何错误消息,即使我尝试更改预期输出,如 expect(getByTestId('test1').toEqual('test2');.
它运行流畅,但不应该。
我不确定我做错了什么。
getByPlaceholderText
returns你first matching node。实际上,它成功地做到了这一点。该节点表示为 一个对象 并且您的测试显示
Expected: "Cirurgião"
Received: {"_fiber": { //<- Here you actually received an object representing the node
发生这种情况是因为您希望对象节点等于字符串(字符串!=节点):
.toEqual('Cirurgião');
您可能想要测试两种可能的情况:
- 组件实际上 there/is 正在渲染吗?
- 视图是否包含我期望的占位符?
要测试第一个,您只需执行以下操作:
getByPlaceholderText('Cirurgião')
如果渲染树中没有组件,它会抛出异常,因此您的测试将失败。
测试第二个将是:
const input = getByPlaceholderText('Cirurgião');
expect(input.props.placeholder).toBe('Cirurgião');