TypeError: недопустимая попытка распространения не повторяемого экземпляра. Чтобы быть итерируемыми, объекты, не являющиеся массивами, должны иметь метод [Symbol.iterator] () - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь проверить значение useState и объект в react native с помощью фермента и шутки. У меня он работает при использовании состояния только с одним значением, но у меня не получается использовать много значений в useState с указанной выше ошибкой. В onchange я использую оператор распространения, и я думаю, что это мне нужно как-то реализовать в моем тесте под mockEvent, но я не могу найти способ, и я застрял. Любая помощь приветствуется.

Компонент:

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;

Тест:

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);
  });

1 Ответ

1 голос
/ 20 июня 2020

Проблема в следующем:

  setUser(...user, [name], e.target.value);

, что не соответствует вашим намерениям. Замена на это может решить эту проблему.

 setUser({ ...user, name: e.target.value })
...