我试图添加一个单元测试来验证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);
});
上面的测试用例并不能满足我的条件。正如我所提到的,同样的错误即将到来。我该如何解决这个问题?
答案 0 :(得分:1)
validateSchema
使用了Promise构造反模式,并显示了它被认为是反图案的原因之一,new Promise
是不需要的构造,容易产生人为错误。
将async
用作Promise
执行者是导致反模式的错误。 Promise
执行者忽略从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
});
答案 1 :(得分:0)
对于大型模式,最好使用yup的validateAt api传递验证路径,这样夹具数据可以更加简洁。
Jest规格可能类似于:
await expect(schema.validateAt(path, fixture)).rejects.toBeTruthy()
it("requires person's name", async () => {
await expect(schema.validateAt('person.name', {})).rejects.toBeFalsy()
await expect(schema.validateAt('person.name', {person: {name: "something"}})).resolves.toBeTruthy()
}
单元测试是很有趣的,因为很多是配置,测试库以它们说的方式工作可能是多余的。但是,这似乎有助于测试更复杂的自定义架构验证行为。
答案 2 :(得分:0)
再举一个例子,我主要是检查真实值
chr*6