sinon存根不替代function

我正在尝试使用sinon stubreplace可能需要时间的函数。 但是当我运行testing时,testing代码似乎没有使用sinon stub。

这是我试图testing的代码。

function takeTooLong() { return returnSomething(); } function returnSomething() { return new Promise((resolve) => { setTimeout(() => { resolve('ok') }, 1500) }) } module.exports = { takeTooLong, returnSomething } 

这是testing代码。

 const chai = require('chai') chai.use(require('chai-string')) chai.use(require('chai-as-promised')) const expect = chai.expect chai.should() const db = require('./database') const sinon = require('sinon') require('sinon-as-promised') describe('Mock the DB connection', function () { it('should use stubs for db connection for takeTooLong', function (done) { const stubbed = sinon.stub(db, 'returnSomething').returns(new Promise((res) => res('kk'))); const result = db.takeTooLong() result.then((res) => { expect(res).to.equal('kk') sinon.assert.calledOnce(stubbed); stubbed.restore() done() }).catch((err) => done(err)) }) 

我得到一个断言错误

  AssertionError: expected 'ok' to equal 'kk' + expected - actual -ok +kk 

我究竟做错了什么? 为什么不使用存根? 摩卡的testing框架。

Sinon将物体的property存根,而不是函数本身。

在你的情况下,你正在导出一个对象的function。

 module.exports = { takeTooLong, returnSomething } 

所以为了从对象中正确地调用函数,你需要把你的函数调用replace为对导出对象的引用:

 function takeTooLong() { return module.exports.returnSomething(); } 

当然,根据你的代码,你总是可以重构它:

 var exports = module.exports = { takeTooLong: function() { return exports.returnSomething() } returnSomething: function() { /* .. */ } }