2017-11-29 38 views
0

이 예제에서 barStub.called === false는 아마도 fooStub의 실행 흐름이 barStub가 해결되기를 기다리지 않기 때문일 수 있습니다.반환되지 않는/병렬 비동기 함수에 대해 스텁/스파이를 만드는 방법은 무엇입니까?

또한 assert(barStub.called)을 10 초 setTimeout에 넣었지만 여전히 호출되지 않았습니다.

바처럼 스텁하는 방법이 있습니까? 여기

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 기능을 완전히 대체합니다.

당신이해야 할 것은 그가 호출 된 경우에 당신이 찾을 수 있도록 얼마나 많은 등 시간

bar의 실제 스터 빙이 정확하지만, 원래의 기능과 흐름을 유지합니다 foospy이다 - 스텁이 실제로 호출되지 않습니다.


는합니다 (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'이므로, 모든 것이 올바르게/구문 적으로 설정되고 있다고 생각합니다. –