2016-11-25 81 views
1

我想用sinon存根替換一個可能需要時間的函數。但是當我運行測試時,測試代碼似乎沒有使用sinon stub。sinon存根沒有替代函數

這是我試圖測試的代碼。

function takeTooLong() { 
    return returnSomething(); 
} 

function returnSomething() { 
    return new Promise((resolve) => { 
     setTimeout(() => { 
      resolve('ok') 
     }, 1500) 
    }) 
} 

module.exports = { 
    takeTooLong, 
    returnSomething 
} 

這是測試代碼。

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 

我在做什麼錯?爲什麼不使用存根?摩卡的測試框架。

+0

你可以在你正在測試的代碼和測試代碼中添加'export'和'require'方法嗎? – drinchev

回答

5

Sinon將對象的property存根,而不是函數本身。

在你的情況下,你是在一個對象內導出該函數。

module.exports = { 
    takeTooLong, 
    returnSomething 
} 

所以,爲了正確地從對象調用函數,你需要與參考像出口對象來代替你的函數調用:

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

當然根據你的代碼,你總是可以重構它:

var exports = module.exports = { 

    takeTooLong: function() { return exports.returnSomething() } 

    returnSomething: function() { /* .. */ } 

}