Sinon没有在module.exports上存根

grp*_*cMe 2 node.js sinon

如果创建具有以下内容的文件

const validateEmail = email => {
    sendEmail(email);
};

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

module.exports = {
  validateEmail,
  sendEmail,
};
Run Code Online (Sandbox Code Playgroud)

并尝试测试第二个功能的测试...

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);
});
Run Code Online (Sandbox Code Playgroud)

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

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

module.exports = {
  validateEmail(email) {
      this.sendEmail(email);
  },
  sendEmail(email) {
    return true;
  },
};
Run Code Online (Sandbox Code Playgroud)

它正确地存根...为什么?

Jam*_*mes 5

简短答案-内容

长的答案-在第一种情形下,导出的sendEmail功能是不一样的使用由内部一个validateEmail。导出的函数成为导出对象的新属性,并且仅引用内部函数。

在第二种情况下,您sendEmail在导出的对象(即this.sendEmail(...))上显式引用了该函数,validateEmail因此它将使用存根版本。

这个故事的寓意-您不能存根看不见的东西。