2017-11-29 14 views
0

この例では、barStub.called === falseです。おそらく、fooStubの実行フローはbarStubが解決するのを待たないからです。非リターン/パラレル非同期関数のスタブ/スパイを作成するにはどうすればよいですか?

また、assert(barStub.called)を10秒setTimeoutに入れましたが、それでも未呼び出しでした。

barのようなメソッドをスタブする方法はありますか?

const sinon = require('sinon') 
const assert = require('assert') 

const functionHolder2 = { 
    bar: function() { 
    return Promise.resolve('bar') 
    } 
} 

const functionHolder = { 
    foo: function() { 
    functionHolder2.bar() 

    return Promise.resolve('foo') 
    } 
} 

const fooStub = sinon.stub(functionHolder, 'foo').returns(Promise.resolve({})) 
const barStub = sinon.stub(functionHolder2, 'bar').returns(Promise.resolve({})) 

functionHolder.foo() 

assert(fooStub.called) // this passes 
assert(barStub.called) // this fails 

答えて

0

ここでの問題はstubあなたがスタブされている機能の機能を置き換えていることです。

これは、約束を返すようにfooをスタブすると、元のfoo機能を完全に置き換えることを意味します。あなたがする必要がどのような

そのが呼び出された場合、あなたが見つけるために可能にしながら、その本来の機能と流れを保つであろう、foospyで、何回など

barの実際のスタブが正しいです - スタブが実際に呼び出されることは決してありません。


は、あなたが(fooコールが終了するのを待っているを含む)欲しい:

const sinon = require('sinon'); 
const assert = require('assert') 

const functionHolder2 = { 
    bar: function() { 
    return Promise.resolve('bar') 
    } 
} 

const functionHolder = { 
    foo: function() { 
    functionHolder2.bar() 

    return Promise.resolve('foo') 
    } 
} 

const fooStub = sinon.spy(functionHolder, 'foo') 
const barStub = sinon.stub(functionHolder2, 'bar').returns(Promise.resolve({})) 

functionHolder.foo().then(() => { 
    assert(fooStub.called) 
    assert(barStub.called) 
}); 

ドキュメントのリンクを:http://sinonjs.org/releases/v4.1.2/spies/

+0

ありがとうございました!この例は間違いなく機能します。実際のコードでは、 'functionHolder.foo'と' functionHolder2.bar'を盗んでいるにもかかわらず、 'barStub'の' callCount'は '0'のままなので、余計な問題が発生するはずです。テストから 'functionHolder2.bar'を直接呼び出すと' callCount'は '1'なので、すべてが正しく/構文的に設定されていると思います。 –

関連する問題