Я пытаюсь проверить функцию, которая принимает другую функцию в качестве параметра - PullRequest
0 голосов
/ 05 октября 2019

Я использую 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] вместо ожидаемого строкового значения, и я не уверен, почему. Будем очень благодарны за любые идеи о том, как исправить этот тест.

1 Ответ

1 голос
/ 06 октября 2019

Я люблю окончательную форму. Это действительно помогло узнать, как использовать функции каррирования. Итак, пример, который вы взяли из окончательной формы, я лично использовал с полями.

composeValidators(required)(value)

Карри - это странная концепция, которую вы можете обойтись без необходимости, поэтому не волнуйтесь, не поняв ее с первого взгляда.

Давайте посмотрим на сигнатуру:

const composeValidators = (...validators) => (value) =>

Первая функция принимает X количество реквизитов или правил проверки. У вас есть эта часть вниз. Теперь вторая функция ожидает значение. Вы, наверное, видели, как он использовался с валидаторами Филда. Если вы посмотрите документацию для FieldProps (см. Ссылку ниже), вы увидите, что она принимает функцию и передает ей 3 аргумента, значение, все значения и мета, а не просто значение. Это может помочь вам написать лучшие правила проверки, которые учитывают больше информации о поле. В любом случае, когда финальная форма использует это, она принимает форму:

composeValidators(required)(value, allValues, meta)

Я не ожидаю, что это будет иметь смысл сразу, но это должно помочь вам подумать об одном конкретном случае использования каррирасширенные настройки. Наслаждайтесь окончательной формой!

https://final -form.org / docs / response-final-form / types / FieldProps

...