我有一些代码:
module.exports = {
idCheck: function(errors) {
errors.some( (error) => {
if (error.parentSchema.regexp === '/^((?!\\bMyId\\b).)*$/i') {
this._recordError('IDCHECK');
}
});
}
};
我试图使用jest测试它:
const IDCheck = require(
'./IDCheck'
);
let errors = [
{
parentSchema: {
regexp: '/^((?!\\bMyId\\b).)*$/i'
}
}
];
describe('IDCheck', () => {
afterEach(() => {
jest.restoreAllMocks();
});
it('calls _recordError with IDCHECK', () => {
jest.spyOn(this, '_recordError');
IDCheck.idCheck(errors);
});
});
然而,当我开玩笑时,我明白了
无法监视_recordError属性,因为它不是函数;取而代之的是undefined
有没有一种模拟方法,测试_recordError()
已被调用,或未调用并使用正确的参数,而不通过_recordError
作为参数?
关于这一行的一些事情:jest.spyOn(this, '_recordError');
this
必须是IDCheck
,因为你没有使用this
,因为你使用的箭头函数如果先前设置了继承this
(它不是)。你可以在线上方的console.log(this)
来证明这一点。
'_recordError'
不是IDCheck
的方法。 spyOn
检查目标的方法,而不是在其中调用的方法。现在,如果_recordError
是IDCheck
的方法,那么你应该没问题。
最后,您基本上必须返回所需的数据以进行验证。除非你退回,否则没有真正的方法可以检查传递的内容。
这是我提出的解决方案,其中不包括您必须实施的一些修复,以解决潜在的工作流程缺陷。
const IDCheck = {
idCheck: function(errors) {
return errors.map(error => {
if (error.parentSchema.regexp === '/^((?!\\bMyId\\b).)*$/i') {
return this._recordError('IDCHECK')
}
})
},
_recordError: function(data) {
return data
}
}
let errors = [
{
parentSchema: {
regexp: '/^((?!\\bMyId\\b).)*$/i'
}
}
];
describe('IDCheck', () => {
afterEach(() => {
jest.restoreAllMocks();
});
it('calls _recordError with IDCHECK', () => {
const spy = jest.spyOn(IDCheck, '_recordError')
const check = IDCheck.idCheck(errors).includes('IDCHECK')
expect(spy).toHaveBeenCalled()
expect(check).toBe(true)
});
});