我试图添加一个单元测试来验证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
});