web-dev-qa-db-ja.com

関数を置き換えないシノンスタブ

時間がかかる可能性のある関数を置き換えるために、sinonスタブを使用しようとしています。しかし、テストを実行すると、テストコードが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

私は何が間違っているのですか?スタブが使用されていないのはなぜですか?モカのテストフレームワーク。

8
AshanPerera

Sinonは、関数自体ではなく、オブジェクトのpropertyをスタブします。

あなたの場合、オブジェクト内でその関数をエクスポートしています。

module.exports = {
  takeTooLong,
  returnSomething
}

したがって、オブジェクトから関数を適切に呼び出すには、関数呼び出しを次のようなエクスポートオブジェクトへの参照に置き換える必要があります。

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

もちろん、コードに基づいて、いつでもリファクタリングできます。

var exports = module.exports = {

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

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

}
12
drinchev