使用 jest 进行测试, 封装的 async-validator 的工具无法进行校验

多厘
  • 858

我计划去做一个校验工具, 可以根据服务端的返回来生成 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...

回复
阅读 164
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏