Sinon无法对module.exports进行桩测试

3
如果创建一个文件,其内容如下:
const validateEmail = email => {
    sendEmail(email);
};

const sendEmail = email => {
  return true;
};

module.exports = {
  validateEmail,
  sendEmail,
};

并且有一个测试试图将第二个函数桩起来...

it('Should call sendEmail if a valid email is passed', () => {
  let sendEmailSpy = sinon.stub(checkEmail, 'sendEmail');
  checkEmail.validateEmail('acorrectemail@therightformat.com');
  assert.isTrue(sendEmailSpy.called);
});

它仍然调用sendEmail函数,测试失败。

但是,如果我像这样编写module.exports

module.exports = {
  validateEmail(email) {
      this.sendEmail(email);
  },
  sendEmail(email) {
    return true;
  },
};

它正确地对其进行了存根...为什么?
1个回答

6

简短回答 - 上下文

长篇回答 - 在第一种情况下,导出的sendEmail函数不是与由validateEmail使用的内部函数相同。导出的函数成为被导出对象的新属性,仅引用内部函数。

在第二种情况下,您明确地从validateEmail调用导出对象上的sendEmail函数(即this.sendEmail(...)),因此它将使用存根版本。

故事的寓意 - 你无法替换你看不到的东西。


好的,使用第一个场景有办法进行存根吗? - grpcMe
@OmisNomis,不是基于你当前的实现方式,需要外部访问才能进行存根。第二种方法有什么问题吗? - James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接