2017-11-29 4 views
0

In diesem Beispiel ist barStub.called === false, vermutlich weil der Ausführungsfluss von fooStub nicht auf die Auflösung von barStub wartet.Wie erstellen Sie einen Stub/Spion für eine nicht zurückgegebene/parallele asynchrone Funktion?

Ich legte auch assert(barStub.called) in einem 10-sekündigen setTimeout, und es war noch nicht aufgerufen.

Gibt es eine Möglichkeit, eine Methode wie bar zu stümpfen?

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 

Antwort

0

Das Problem hierbei ist, dass ein stub die Funktionalität der Funktion ersetzt Sie Anstoßen.

Dies bedeutet, dass, wenn Sie foo stub, um ein Versprechen zurückzugeben, es vollständig ersetzt die ursprüngliche foo Funktion.

Was Sie tun müssen, ist spy auf foo, die ihre ursprüngliche Funktionalität und Strömung halten, während Sie gleichzeitig herausfinden, ob seine gerufen worden und wie oft usw.

Die tatsächlichen Anstoßen von bar korrekt sind - Es ist nur so, dass der Stub niemals wirklich aufgerufen wird.


Was Sie wollen (einschließlich Warten auf die foo Anruf beenden): link

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) 
}); 

Dokumentation: http://sinonjs.org/releases/v4.1.2/spies/

+0

Vielen Dank! Dieses Beispiel funktioniert definitiv. Es muss ein paar irrelevante Probleme in meinem eigentlichen Code geben, denn trotz "functionHolder.foo" und stubbing "functionHolder2.bar" bleibt "callCount" auf "barStub" gleich "0". Wenn ich 'functionHolder2.bar' direkt aus dem Test heraus anrufe, ist' callCount' '1', also glaube ich, dass alles korrekt/syntaktisch aufgebaut ist. –

Verwandte Themen