У меня есть знания в области модульного тестирования автономных функций, таких как вспомогательные классы, но как мне работать с функциями, которые не являются автономными, обычно в файле класса, который имеет несколько проверок и результатов?
Пример ниже, показывающий проверку нескольких условий и ответ в разных результатах.
- Вызывать ли функции
valueCheck
иproceedApiCheck
в моем тестовом примере? Но есть разные сценарии или действия, которые мне не нужны в тесте. (например, setState/навигация) - Написать ли мне новую функцию
valueCheck
иproceedApiCheck
в моем тестовом примере? Но это будет означать, что у меня есть 2 разные логики в моем коде. Когда-нибудь, если я изменю свою логику в приложении, мой тестовый пример не завершится ошибкой, поскольку он ссылается на старую логику.
Кто-нибудь из вас может пролить свет на это?
Пример
export class Screen1 extends React.Component {
valueCheck = (value) => {
if(value === 'abc'){
this.setState({ isNavigating:true, transfer: true })
this.proceedApiCheck(value)
}
if(value === '123'){
this.setState({ isNavigating:true, transfer: false })
this.proceedApiCheck(value)
}
}
proceedApiCheck = async(value) =>{
let data
try{
data = await FirstApi(value);
this.setState(data)
}catch(){
this.navigateToScreen('Failure')
return;
}
switch(data.name){
case 'fake adidas':
this.navigateToScreen('Failure')
return;
case 'fake nike':
this.navigateToScreen('Failure')
return;
}
try{
const result = await secondApi(data.price);
switch(result.currency){
case 'EURO':
this.navigateToScreen('Euro')
case 'Pound':
this.navigateToScreen('Pound')
default:
this.navigateToScreen('Dollar')
}
}catch(){
this.navigateToScreen('Failure')
return;
}
}
}
Ваш вопрос кажется субъективным и слишком открытым, неясно, что вы действительно хотите получить. Попробуйте предоставить пример модульного теста и сузить фокус вашего запроса. Я предлагаю также изучить React-Testing-Library для модульного тестирования пользовательского интерфейса.
Привет @DrewReese, спасибо за ваши комментарии. Я обновил свой вопрос, чтобы он был очень конкретным при тестировании не автономных функций. Спасибо, что указали. Мой вопрос действительно заключается в том, как UnitTest всегда может ссылаться на 1 часть логики, поэтому при обновлении логики приложения нам не требуется обновлять логику UnitTest. Это мое замешательство.
Я не уверен, что понимаю ваше замешательство. Вы экспортируете/импортируете функции/компоненты, которые хотите протестировать.
Ах, я думаю, что понимаю путаницу... именно поэтому я указал вам на RTL.... суть просто в том, что вы не "добираетесь" до компонентов React и не касаетесь внутренних реализаций при модульном тестировании, а скорее что вы взаимодействуете с компонентом через его API, то есть
props
и пользовательский интерфейс, так же, как другие компоненты и пользователи. Если вам нужно или можно, вы можете вытащить определенный фрагмент кода в служебную функцию и протестировать изолированно, хотя это невозможно, если они связаны с обновлениями состояния компонентов.@TommyLeong Чтобы выполнить модульное тестирование, напишите тестируемый код для любого модуля, который вам нужно охватить. В вашем случае эти две функции не являются хорошими единицами, а
Screen1
. попробуйте написать единичный случай для Screen1 с фиктивными данными, которые вызовут valueCheckПривет @Horst, вы предлагаете мне выполнить модульный тест непосредственно на
Screen1
вместо двух функций?