Jest-тестирование переменных внутри компонентных методов

1

Скажем, у меня есть компонент класса, который имеет что-то вроде этого:

export class Math extends React.Component {
    ...
    someComponentMethod = numb => {
        const sample = numb * 10 
        ...
        const result = numb -5
        return result
    }

Можно ли сделать тестовые утверждения для переменной sample в Jest?

  • 0
    Я не верю, что это технически возможно. Какова ваша мотивация?
Теги:
enzyme
jasmine
tdd
jest

1 ответ

4
Лучший ответ

Невозможно написать утверждения для частных внутренних функций.

Я лично нашел этот барьер, чтобы поощрять лучшие тесты, которые нужно написать. Путем тестирования только публичного API для правильности, у вас есть возможность реорганизовать внутренности без необходимости обновления каких-либо тестов. Существующие тесты продолжают обеспечивать правильную работу внутренних изменений.

Написание тестов против внутреннего поведения легко увеличивает усилия по обслуживанию тестируемого кода. Поскольку тесты становятся более тесно связанными с исходным кодом, им нужно будет уделять больше внимания при внесении изменений. Это также может ухудшить надежность тестов, поскольку больше изменений в тестах увеличивает вероятность ошибок, проявляющихся в самих тестах.

Если вы обнаружите, что хотите проверить какое-то внутреннее поведение, возможно, самое время извлечь некоторые функции. В вашем примере вычисление sample может быть извлечено в чистую функцию:

export class Math extends React.Component {
    ...

    computeSampleValue(input) {
        return input * 10
    }

    someComponentMethod = numb => {
        const sample = this.computeSampleValue(numb)
        ...
        const result = numb -5
        return result
    }
}

Теперь вы можете утверждать, что любая логика, используемая для вычисления значения sample работает как ожидалось для разных входных данных. Это извлечение логики часто делает someComponentMethod более читаемым.

Если вам абсолютно необходимо проверить какое-то другое внутреннее поведение и знать о увеличенном долге кода, вы можете заставить свой метод выполнять побочные эффекты и писать утверждения для них. Например, вместо определения sample в качестве переменной-функции, создайте свойство this.sample на экземпляре компонента и обновите его. В тесте вы вызываете метод target, а затем утверждаете, что параметр componentInstance.sample был изменен, как ожидалось.

  • 0
    Спасибо за ответ! Я закончил тем, что создал состояние компонента. Единственная цель - просто проверить внутреннюю переменную с помощью setState и оттуда у меня есть доступ к ней через jest
  • 1
    Это работает, просто имейте в setState что использование setState вызовет повторную визуализацию компонента. Если ваш метод render() не использует это свойство, тогда эти повторные рендеры являются напрасными вычислениями. Если свойство используется только для тестирования, рассмотрите возможность использования обычного свойства класса ( this.sample = ... ) вместо состояния.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню