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() { /* .. */ } }