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

问题描述 投票:0回答:1

我有一些代码:

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作为参数?

node.js tdd bdd jestjs
1个回答
1
投票

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

this必须是IDCheck,因为你没有使用this,因为你使用的箭头函数如果先前设置了继承this(它不是)。你可以在线上方的console.log(this)来证明这一点。

'_recordError'不是IDCheck的方法。 spyOn检查目标的方法,而不是在其中调用的方法。现在,如果_recordErrorIDCheck的方法,那么你应该没问题。

最后,您基本上必须返回所需的数据以进行验证。除非你退回,否则没有真正的方法可以检查传递的内容。

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

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)
  });
});
© www.soinside.com 2019 - 2024. All rights reserved.