ReactJS使用Jest spyOn测试一个辅助方法

时间:2019-10-27 07:39:25

标签: reactjs unit-testing jestjs

所以我有以下帮助方法-

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;

现在,我想编写一个测试,以测试是否使用spyOn调用了isString方法。如果我做这样的事情-

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'

如果我尝试在方法validateField中添加isString方法,它仍然会抱怨相同的问题。

任何建议都将受到欢迎。

1 个答案:

答案 0 :(得分:0)

该错误表示所监视的属性不存在,按类型的术语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中公开并直接在您的应用程序中使用,否则您可以将其导出到模块中,然后进行相应的模拟。