Ref возвращает неопределенное значение во время мелкой шутки рендеринга / энзима

#javascript #reactjs #jestjs #enzyme

#javascript #reactjs #jestjs #enzyme

Вопрос:

Я хочу протестировать событие input onchange в компоненте. У меня есть такой jsx:

     export default class Login extends Component {
  constructor(props) {
    super(props);
    autoBind(this);
  }

  handleChangeFields() {
    const email = this.email.value;
    const password = this.password.value;

    const validationResults = {
      email: isValidEmail(email),
      password: password.length >= 8,
    };

    const isValidFields = Object.values(validationResults).every(Boolean);


  }


  render() {
    
    return (
      <form onSubmit={this.validateLoginForm}>
        <input
          type="email"
          name="email"
          ref={(input) => this.email = input}
          placeholder="Email *"
          onChange={this.handleChangeFields}
        />
        <input
          type="password"
          name="password"
          ref={(input) => this.password = input}
          placeholder="Password *"
          onChange={this.handleChangeFields}
        />
       
        <input
         
          type="submit"
          value="login"
        />
      </form>
    );
  }
}
  

Я написал такой тест, чтобы проверить, был ли вызван handleChangeFields :

 test('should call fields change method', () => {
      const instance = wrapper.instance();
      const spyChange = jest.spyOn(instance, 'handleChangeFields');

      const input = wrapper.find('input').at(0);

      input.simulate('change', { target: { value: 'test@test.com' } });
      expect(spyChange).toHaveBeenCalled();
    });
  

но у меня ошибка во время тестового вызова:

 TypeError: Cannot read property 'value' of undefined
  

но я не могу понять, почему произошла ошибка. Я установил значение ввода в тесте jest input.simulate('change', { target: { value: 'test@test.com' } }); , но ошибка все еще присутствует

Комментарии:

1. handleChangeFields используется как обратный вызов, но не является стрелкой. Это связано? Я не уверен, что проблема в ссылках, может быть, потому, что он получает неверно this .

2. handleChangeFields не является функцией обратного вызова, она привязана к классу

3. добавлен весь компонент

4. Здесь он используется как обратный вызов onChange={this.handleChangeFields} . В любом случае, это, похоже, не проблема. Ссылки — известная проблема, github.com/enzymejs/enzyme/issues/1394 . Используйте mount , чтобы заставить Enzyme вести себя более как настоящий рендерер.

5. изменено, но сейчас возникает другая проблема. По какой-то причине метод не вызывается, вот результат теста Ожидаемое количество вызовов: >= 1 Полученное количество вызовов: 0 Я создам другой поток