类型错误:传播不可迭代实例的尝试无效。为了可迭代,非数组对象必须具有 [Symbol.iterator]() 方法

1 native reactjs jestjs enzyme

我正在尝试测试 useState 值和对象与酶和玩笑的本机反应。当使用只有一个值的状态时,它可以工作,但我在 useState 中使用许多值时失败,并出现上述错误。在 onchange 中,我使用展开运算符,我认为这就是我需要在模拟事件下的测试中以某种方式实现的,但我找不到方法,我被困住了。任何帮助是极大的赞赏。

成分:

import React from "react";
import { View, Text, TextInput, TouchableOpacity } from "react-native";

const RegisterScreen = () => {
const [user, setUser] = React.useState({ name: "", email: "", password: "", password2: "" });
return (
<View testID='register-component'>
  <Text testID='test'>RegisterScreen</Text>
  <TextInput
    testID='register-input-name'
    onChangeText={(e) => {
      setUser(...user, [name], e.target.value);
    }}
    name='name'
    value={user.name}
  />
  <TextInput testID='register-input-email' />
  <TextInput testID='register-input-password' label='Password' autoCapitalize='none' autoCorrect={false} secureTextEntry={true} />
  <TextInput testID='register-input-confirm' />
  <TouchableOpacity testID='register-submit-button' />
</View>
);
};

export default RegisterScreen;
Run Code Online (Sandbox Code Playgroud)

测试:

test("name input changes state", () => {
    const mockSetUser = jest.fn();
    React.useState = jest.fn(() => [{ name: "", email: "", password: "", password2: "" }, mockSetUser]);

    const wrapper = shallow(<RegisterScreen />);
    const nameinput = wrapper.find("[testID='register-input-name']");

    const mockEvent = { target: { name: "name", value: "test" } };

    nameinput.simulate("changeText", mockEvent);
    const nameVal = nameinput.find("[value='test']");
    expect(nameVal.length).toBe(1);
  });
Run Code Online (Sandbox Code Playgroud)

Son*_*yen 6

问题是这样的:

  setUser(...user, [name], e.target.value);
Run Code Online (Sandbox Code Playgroud)

这不符合您的意图。更换这个也许可以解决问题。

 setUser({ ...user, name: e.target.value })
Run Code Online (Sandbox Code Playgroud)