ReactJS Тестирование вспомогательного метода с использованием jest spyOn - PullRequest
0 голосов
/ 27 октября 2019

Итак, у меня есть следующий вспомогательный метод -

import { FormFieldError, FormValidationRules } from "../../../types/form.type";

const isString = (value: any, fieldId: string, fieldName: string): FormFieldError | null => {
  // Check if field value is of type string
  if (typeof value !== 'string') {
    return {
      fieldId,
      message: `${fieldName} must be string.`
    };
  }

  return null;
}

const validateField = (value: any, rules: FormValidationRules[], fieldId: string, fieldName: string): FormFieldError | null => {
  let error: FormFieldError | null = null;

  // Let's go through each of the rules
  for (const rule of rules) {
    // Let's check against mandatory value
    if (error === null && rule === 'string') {
      error = isString(value, fieldId, fieldName);
    } else if (error !== null) {
      break;
    }
  }

  // Let's return the error
  return error;
}

export default validateField;

Теперь я хочу написать тест, который проверяет, вызывается ли метод isString с использованием spyOn. Если я делаю что-то вроде этого -

import validateField from './FormValidationRules';

describe('Test if necessary functions are called', () => {
  it('Should call isString method with according parameters', () => {
    const isStringSpy = spyOn(validateField, 'isString');

    validateField(null, ['string'], 'name', 'Name');

    expect(isStringSpy).toHaveBeenCalled();
  });
});

Он жалуется на Argument of type "isString" is not assignable to parameter of type 'never'.

Если я пытаюсь добавить метод isString в функцию validateField, он все равно жалуется на ту же проблему.

Любые предложения приветствуются.

1 Ответ

0 голосов
/ 27 октября 2019

Ошибка означает, что свойство, за которым шпионят, не существует, которое в напечатанных терминах имеет тип NonFunctionPropertyName.

https://github.com/facebook/jest/blob/v24.9.0/packages/jest-mock/src/index.ts#L965-L984

Этодопустимая ошибка, потому что в модуле ./FormValidationRules экспорт по умолчанию - функция validateField, а isString - модуль приватный .

Я оставлю тестирование, чтобы сосредоточиться на результатах проверки не-строковые значения передаются для полей, проверенных по правилу string, и обрабатываются isString как подробности реализации. например,

result = validateField(null, ['string'], 'name', 'Name');
expect(result).toEqual({
      'name',
      message: 'Name must be string.'
    })

Если isString не будет отображаться в ./FormValidationRules и использоваться непосредственно в вашем приложении, вы можете экспортировать его в модуль, а затем смоделировать его соответствующим образом.

...