2016-03-02 19 views
7

この関数が定義されている同じモジュール内から呼び出された関数をスタブする方法を見つけられません(スタブは機能していないようです)。ここでは例を示します。同じモジュールから呼び出されたスタブモジュール関数

myModule.js:

'use strict' 

function foo() { 
    return 'foo' 
} 

exports.foo = foo 

function bar() { 
    return foo() 
} 

exports.bar = bar 

myModule.test.js:

'use strict' 

const chai = require('chai') 
const sinon = require('sinon') 

chai.should() 

const myModule = require('./myModule') 

describe('myModule',() => { 
    describe('bar',() => { 
    it('should return foo',() => { 
     myModule.bar().should.equal('foo') // succeeds 
    }) 

    describe('when stubbed',() => { 
     before(() => { 
     sinon.stub(myModule, 'foo').returns('foo2') // this stub seems ignored 
     }) 

     it('should return foo2',() => { 
     myModule.bar().should.equal('foo2') // fails 
     }) 
    }) 
    }) 
}) 

これは(ほとんど)stubbableではありませんJavaの静的な機能のことを思い出します。

どのように私がやろうとしていることを達成するためのアイデア?私は別のモジュールでfooを抽出することができますが、それは私がここでやろうとしていることではありません。私はまた、メソッドでthisというキーワードを使用してfooを呼び出すことも可能であることを認識しています。このコンテキストでthisの使用に困惑しています(OOPを使用していないため)。

答えて

7

これをテストしました。そしてそれは魅力のように機能します。

'use strict' 

function foo() { 
    return 'foo'; 
} 

exports.foo = foo; 

function bar() { 
    return exports.foo(); 
} 

exports.bar = bar; 

説明

あなたはsinon.stub(myModule, 'foo').returns('foo2')その後、sinonスタブごmyModule.js内側からexportedオブジェクトのfooない、実際にfoo機能を行う...あなたが知っている必要がありますよう、fooが外部からアクセス可能ですモジュールしたがって、exports.fooを設定すると、エクスポートされたオブジェクトexports.fooは、fooの参照を格納します。あなたがsinon.stub(myModule, 'foo').returns('foo2')を呼び出すときに、sinonexports.fooスタブではなく、実際のfoo

希望は、これは理にかなっているでしょう!

+0

すばらしい、ありがとう。これは 'this'と同じ仕事をしているが、それはやるだろうから、' exports'を使うのは少し醜いです。静的コンテキストで 'this'を使用すると、私の心は少しばかり動揺しました。 – Simon

+0

あなたは私の友人を大歓迎しています! –

+0

ソースコードを変更できない場合はどうすればよいですか? – nbkhope

関連する問題