Скажем, у меня есть компонент класса, который имеет что-то вроде этого:
export class Math extends React.Component {
...
someComponentMethod = numb => {
const sample = numb * 10
...
const result = numb -5
return result
}
Можно ли сделать тестовые утверждения для переменной sample
в Jest?
Невозможно написать утверждения для частных внутренних функций.
Я лично нашел этот барьер, чтобы поощрять лучшие тесты, которые нужно написать. Путем тестирования только публичного 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
был изменен, как ожидалось.
setState
и оттуда у меня есть доступ к ней через jest
setState
что использование setState
вызовет повторную визуализацию компонента. Если ваш метод render()
не использует это свойство, тогда эти повторные рендеры являются напрасными вычислениями. Если свойство используется только для тестирования, рассмотрите возможность использования обычного свойства класса ( this.sample = ...
) вместо состояния.