На каком уровне я должен начинать / останавливать написание тестов? - PullRequest
1 голос
/ 07 ноября 2019

Итак, я начал использовать реагирующее-тестирование-библиотеку , и мне действительно нравится идея для проверки действий пользователя, не подробности реализации .

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

Давайте рассмотрим следующий код в качестве примера:

OrderCreatePage

function CreateOrderPage() {
  const [stepOneFrom, setStepOneForm] = useState({});
  const [stepTwoFrom, setStepTwoForm] = useState({});
  const [stepThreeFrom, setStepThreeForm] = useState({});
  const [step, setStep] = useState(1);

  const previousStep = () => {
    setStep(prev => prev - 1);
  }

  const nextStep = () => {
    setStep(prev => prev + 1);
  }

  const createOrder = () => {
    endpoint.createOrder({
      stepOneForm,
      stepTwoForm,
      stepThreeForm
    });
  }

  return (
    <div>
      {step === 1 && 
        <StepOne
          form={stepOneForm}
          onNextStep={nextStep}
          onFormChange={setStepOneForm}
        />
       }
      {step === 2 && 
        <StepTwo
          form={stepTwoForm}
          onNextStep={nextStep}
          onPreviousStep={previousStep}
          onFormChange={setStepTwoForm}
        />
       }
      {step === 2 && 
        <StepTwo
          form={stepTwoForm}
          onPreviousStep={previousStep}
          onCreateOrder={createOrder}
          onFormChange={setStepTwoForm}
        />
       }
    </div>
  );
}

StepOne

function StepOne(props) {
  const isValidForm() => {
    return // do some checks on props.form
  }

  const handleNextClick = () => {
    if(isValidForm()){
      props.onNextStep();
    }
  }

  return (
    <div>
      <ArticlesForm form={props.form} onFormChange={props.onFormChange}/> // StepTwo and StepThree e.g. have DeliveryForm and PaymentForm
      <button onClick={props.nextStep}>Next</button>
    </div>
  );
}

Для StepTwo и StepThree, просто представьте, что они похожи на StepOne.

ArticleForm, в приведенном выше примере объявляются все поля ввода и т. Д. и обновляет значения формы.

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

  • Уровень формы aka ArticleForm: проверка правильности обновления формы
  • Уровень шага aka StepOne: тестируйте шаг независимо от других шагов, убедитесь, что вы можете перейти к следующему шагу только тогда, когда форма действительна
  • Уровень страницы aka OrderCreatePage: проверить переходы шагов (включая проверки правильности) и проверить, можете ли вы создать заказ

Так с чего начать тестирование здесь?

Если вы пишете тест для ArticleForm, то вы не тестируете валидацию, поэтому вам нужно написать тесты для StepOne. Если вы уже написали тест для ArticleForm, вам нужно было бы скопировать логику заполнения полей ввода из этого теста, что делает ArticleFrom тесты бесполезными. Хорошо, давайте пропустим ArticleForm тесты.

Для переходов вам нужно протестировать OrderCreatePage сейчас. На этот раз вам необходимо скопировать логику ввода действительных / недействительных данных из StepOneStepTwo, StepThree) тестов, иначе вы не сможете выполнить / проверить переходы. Так что просто удалите тесты StepOneStepTwo, StepThree).

Но в результате получается большой тестовый файл для OrderCreatePage, который больше не подходит для юнит-теста.

Буду очень признателен за любую помощь, потому что у меня всегда возникают такие мысли ..

1 Ответ

1 голос
/ 07 ноября 2019

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

Мне нравится подход автораиспользуемая вами библиотека (библиотеки-реагирования-тестирования) https://kentcdodds.com/blog/write-tests

Запись тестов. Не так много. В основном интеграция.

В вашем примере я бы попытался взглянуть на это не с точки зрения кода, а с точки зрения пользователя:

счастливый поток: пользователь должен иметь возможность выполнить всепошагово и отправляет форму (там может потребоваться какое-то насмешливо)

крайний случай: пользователь не должен иметь возможность создавать заказ, если не все поля заполнены / шаг не подтвержден и т. д.

В общеместь много правильных ответов на этот вопрос, поэтому будьте непредвзяты, экспериментируйте и учитесь, здесь нет серебряной пули

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...