jest模拟函数而不作为回调传递

时间:2018-03-06 17:28:08

标签: node.js tdd bdd jestjs

我有一些代码:

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属性,因为它不是函数;取而代之的是未定义的

有没有一种方法可以模拟,测试_recordError()已被调用,或未调用并使用正确的参数,而不将_recordError作为参数传递?

1 个答案:

答案 0 :(得分:1)

关于这一行的一些事项:jest.spyOn(this, '_recordError');

this必须为IDCheck,因为您使用的箭头函数如果之前设置了this,则范围内没有this(它不是console.log(this) T)。你可以'_recordError'在线的正上方来证明这一点。

IDCheck不是spyOn的方法。 _recordError检查目标的方法,而不是其中调用的方法。现在如果IDCheckconst 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) }); }); 的方法,那么你应该没问题。

最后,您基本上必须返回所需的数据才能进行验证。除非你把它归还,否则没有真正的方法可以检查通过的内容。

这是我提出的解决方案,其中不包含您必须实施的一些修复,以解决潜在的工作流程缺陷。

rollapplyr
相关问题