我正在使用chai尝试对在线找到的验证功能进行单元测试。此验证功能正在“反应最终形式”组件内部使用。
这是我从中获得此验证器功能的地方:
https://youtu.be/OEg8jm-NbQ0?t=567
import chai, { expect } from "chai";
import chaiEnzyme from "chai-enzyme";
chai.use(chaiEnzyme());
const required = (value) => value === '' ? 'This is required.' : undefined;
const url = (value) => value && !(/^\/[a-z0-9]+$|[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/gi).test(value) ? 'This does not appear to be a link.': undefined;
const composeValidators = (...validators) =>
(value) =>
validators.reduce((error, validator) => error || validator(value), undefined);
let value = '';
describe("Forms", () => {
describe("Final form", () => {
describe("Utils", () => {
it("Returns correct error message when form field value is empty and field is required", () => {
expect(composeValidators(required)).to.equal('This is required.');
});
it("Returns correct error message when form field value is not empty and field should be a url", () => {
value = 'not empty';
expect(composeValidators(url)).to.equal('This does not appear to be a link.');
});
});
});
});
当前,两个断言都返回[function]而不是我期望的字符串值,我不确定为什么。关于如何解决此测试的任何想法将不胜感激。
答案 0 :(得分:1)
我喜欢最终形式。它确实有助于深入了解如何使用currying函数。因此,您从我个人使用过的字段的最终形式中获取的示例。
composeValidators(required)(value)
咖喱是一个奇怪的概念,您可以不需要它而获得帮助,因此不要担心乍一看就不会理解它。
让我们看一下签名:
const composeValidators = (...validators) => (value) =>
第一个函数需要X个道具或验证规则。您已经做好了这部分。现在,第二个函数需要一个值。您可能已经看到它与Field的验证道具一起使用。如果您查看FieldProps的文档(请参见下面的链接),您会看到它带有一个函数并向其传递3个参数,值,allValues和meta,而不仅仅是值。这可以帮助您编写更好的验证规则,并考虑有关该字段的更多信息。无论如何,当最终形式使用此形式时,它的形式为:
composeValidators(required)(value, allValues, meta)
我不认为这会立即生效,但是它应该可以帮助您考虑一个具体的currying用例,其中包含一些高级选项。享受最终形式!
https://final-form.org/docs/react-final-form/types/FieldProps