Как написать тестовый пример, используя функцию Jest для функции Yup.isValid? - PullRequest
0 голосов
/ 14 января 2019

Я пытаюсь добавить модульный тест для проверки функции Yup.isValid, но после запуска тестовый пример показывает ошибку: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL. Даже если я изменяю минимальное время ожидания жасмина, эта же ошибка отображается. Моя функция для проверки схемы Yup:

export const validateSchema= (
  validationSchema,
  data
) => {
  return new Promise(async (resolve, reject) => {
    await validationSchema
      isValid(data)
      .then(isFormValid => {
        //passing response to method
      })
      .catch(error => reject(error));
  });
};

Мой тестовый пример:

test("validate Schema",async () => {
    let catchFn = jest.fn();
    let data= someSampleData;
    //data is valid as per the schema
   await validationSchema(
        validationSchema,
        data
      )
      .then(res => {
       //My expected condition
      })
      .catch(catchFn);
  });

Приведенный выше контрольный пример не идет туда, где я могу поставить свое состояние. Идет та же ошибка, как я уже говорил. Как я могу исправить эту проблему?

1 Ответ

0 голосов
/ 14 января 2019

validateSchema использует обещанную конструкцию antipattern и показывает одну из причин, по которой он считается антипаттерном, new Promise - ненужная конструкция, подверженная человеческим ошибкам.

Использование async в качестве Promise исполнителя является ошибкой, вносящей вклад в антипаттерн. Promise executor игнорирует обещание, возвращаемое функцией async. resolve никогда не вызывается, а .catch(error => reject(error)) не работает. validateSchema возвращает либо отклоненное, либо ожидающее обещание. Если ожидаемое обещание возвращается из теста, это приводит к тайм-ауту.

Это должно быть:

export const validateSchema= async (
  validationSchema,
  data
) => {
    await validationSchema;
    const isFormValid = isValid(data);
    await updateFormValidFlag(isFormValid, theFormName); // does it return a promise?
  });
};

Смешивание await и необработанных обещаний редко когда-либо требуется. Использование фиктивной функции в catch в тесте приведет к ошибкам подавления, что редко является желательным поведением.

Тест может быть:

test("validate Schema",async () => {
   let data= someSampleData;
   await validateSchema(...);
   //My expected condition
});
...