所以我有以下帮助方法-
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方法,它仍然会抱怨相同的问题。
任何建议都将受到欢迎。
答案 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
中公开并直接在您的应用程序中使用,否则您可以将其导出到模块中,然后进行相应的模拟。