reactjs – 如何使用Jest为Yup.isValid函数编写测试用例?

我试图添加一个单元测试来验证Yup.isValid函数,但运行后的测试用例显示错误为:超时 – 在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);
  });

上面的测试用例不会在那里我可以把我的病情.我提到的同样的错误即将到来.我该如何解决这个问题?

最佳答案 validateSchema使用promise构造反模式,并显示为什么它被认为是反模式的原因之一,新的Promise是不需要的构造,容易出现人为错误.

使用async作为Promise执行程序是一个错误,它有助于反模式. Promise执行程序忽略从异步函数返回的promise.从不调用resolve,而.catch(error => reject(error))是no-op. validateSchema返回被拒绝或待决的承诺.如果从测试返回挂起的promise,则会导致超时.

它应该是:

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

很少需要混合等待和原始承诺.在catch测试中使用虚函数会导致压抑错误,这很少是一种理想的行为.

测试可以是:

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