【问题标题】:jest mocking functions without passing as a callback开玩笑地模拟函数而不作为回调传递
【发布时间】:2018-03-06 17:28:07
【问题描述】:

我有一些类似的代码:

module.exports = {
  idCheck: function(errors) {
    errors.some( (error) => {
      if (error.parentSchema.regexp === '/^((?!\\bMyId\\b).)*$/i') {
        this._recordError('IDCHECK');
      }
    });
  }
};

我正在尝试用这个玩笑来测试它:

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

【问题讨论】:

  • 我觉得应该是jest.spyOn(IDCheck, '_recordError')
  • 不,同样的错误。

标签: node.js tdd bdd jestjs


【解决方案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)
  });
});

【讨论】:

  • 干杯@ReyHaynes。出于兴趣,我对 JS 还很陌生,所以你会说我的代码结构很差,还是说测试工具还在开发中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-07
  • 2021-03-09
  • 1970-01-01
  • 2019-03-28
  • 1970-01-01
  • 2017-07-01
  • 1970-01-01
相关资源
最近更新 更多