我计划去做一个校验工具, 可以根据服务端的返回来生成 form 表单并进行校验, 所以我选用的是 element-plus, 这个校验工具使用的是 async-validator.
后端使用的 是 laravel, 所以我想服务端返回规则, 然后再前端去生成 async-validator 的规则去进行校验. 但是在 jest 测试的过程中出现了问题
Error: thrown: "Exceeded timeout of 5000 ms for a test.
Use jest.setTimeout(newTimeout) to increase the timeout value, if this is a long-running test."
这里的代码是:
describe('validator', () => {
it('works-s', (done) => {
console.log(Rules.make({
name: 'required'
}));
(new Schema(Rules.make({
name: 'required'
}))).validate({ n: '' }, errors => {
console.log(done);
console.log(errors);
done();
}).then(() => {
console.log('a')
done()
}).catch(() => {
console.log('b')
done()
})
})
});
这里跟踪的原因是: 没有检测到 done
函数的执行, 但是在官方的jest 测试中是没有任何问题的, 代码在 async-validator test validator 这里
describe('async-validator', () => {
it('works', done => {
new Schema({
v: [
{
validator(rule, value, callback) {
callback(new Error('e1'));
}
},
{
validator(rule, value, callback) {
callback(new Error('e2'));
}
}
],
v2: [
{
validator(rule, value, callback) {
callback(new Error('e3'));
}
}
],
v3: [
{
validator() {
return false;
}
},
{
validator() {
return new Error('e5');
}
},
{
validator() {
return false;
},
message: 'e6'
},
{
validator() {
return true;
}
},
// Customize with empty message
{
validator() {
return false;
},
message: ''
}
]
}).validate(
{
v: 2
},
errors => {
expect(errors.length).toBe(7);
expect(errors[0].message).toBe('e1');
expect(errors[1].message).toBe('e2');
expect(errors[2].message).toBe('e3');
expect(errors[3].message).toBe('v3 fails');
expect(errors[4].message).toBe('e5');
expect(errors[5].message).toBe('e6');
expect(errors[6].message).toBe('');
done();
}
);
});
});
这里唯一的差别就是自己生成的规则
Rules.make({
name: 'required'
})
但是这里返回的内容是数组, 是和 async-validator 符合的
console.log(Rules.make({name:'required'}))
{
name: [
{ validator: [Function: validator] },
{ validator: [Function: validator] }
]
}
这样导致一个问题就是无法去写 jest 的执行规则, 想问下各位朋友, 这里应该如何才能让 jest 运行下去, 是哪里还没有注意到么 ?
Rules.ts 的源码位置 : https://github.com/imvkmark/w...