Функция тестирования React Unit vs ArrowFunction

У меня простая страница с двумя div. Цвет фона второго div зависит от состояния активного свойства. Если активный истинно, тогда он должен использовать класс .active из файла CSS, иначе использовать стиль .два.

Я написал модульный тест для этого сценария, чтобы проверить, изменился ли стиль второго div после изменения состояния.

Я понял одну вещь: когда я выполняю функцию стиль(), чтобы получить правильное имя стиля, модульный тест не работает, и мой стиль во втором div не обновляется. Но когда я выполняю стиль как стрелочную функцию, все работает. Кто-нибудь из вас знает, почему это происходит? в чем проблема с вызовом функции нормальный? почему render () не вызывается?

Вывод на консоль стрелочной функции (ожидается)

console.info src/containers/Example/Example.test.js:18
  false
console.info src/containers/Example/Example.test.js:19
  two
console.info src/containers/Example/Example.test.js:21
  true
console.info src/containers/Example/Example.test.js:22
  active

Нормальная работа (неправильный вывод)

console.info src/containers/Example/Example.test.js:18
  false
console.info src/containers/Example/Example.test.js:19
  two
console.info src/containers/Example/Example.test.js:21
  true
console.info src/containers/Example/Example.test.js:22
  two

Компонент с функцией стрелки

При замене () => this.style () на this.style () модульный тест завершится ошибкой.

import React, {Component} from 'react';
import styles from './Example.module.css';

class Example extends Component {

  state = {
    active: false
  };

  active = () => {
    this.setState({active: !this.state.active});
  };

  style = () => {
    return this.state.active ? styles.active : styles.two;
  };

  render() {
    return (
        <div>
          <div onClick = {() => this.active()} className = {styles.one}/>
          <div className = {() => this.style()}/>
        </div>
    );
  }
}

export default Example;

Модульный тест для компонента

import React from 'react';
import Adapter from 'enzyme-adapter-react-16';
import {configure, mount} from 'enzyme';
import styles from './Example.module.css';

import Example from './Example';

configure({adapter: new Adapter()});

let component;

beforeEach(() => {
  component = mount(<Example/>);
});

it('description', () => {
  let two = component.find('div').at(2);
  console.info(component.state().active);
  console.info(two.props()["className"]());
  component.setState({active: true});
  console.info(component.state().active);
  console.info(two.props()["className"]());
});

Для второго случая this.style () вам нужно немного изменить вывод консоли

  • замените этот console.info (two.props () ["имя класса"]); на этот console.info (two.props () "имя класса");
  • замените этот console.info (two.props () ["имя класса"]); на этот console.info (two.props () "имя класса");
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
268
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема не в модульном тестировании, а в использовании функций в JavaScript. Это также применимо к производственному приложению.

Ожидается, что опора onClick будет функцией. Выражение () => this.style() - это функция. this.style() - результат вызова метода style, строка.

Поскольку метод style уже привязан к экземпляру компонента (это стрелка), его не нужно оборачивать другой стрелкой. Должен быть:

<div className = {this.style}/>

Другие вопросы по теме