2016-11-25 5 views
1

Я пытаюсь использовать заглушку sinon, чтобы заменить функцию, которая может занять время. Но когда я запускаю тесты, тестовый код, похоже, не использует синус-заглушки.sinon stub не заменяя функцию

Вот код, который я пытаюсь проверить.

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

} 
Смежные вопросы