web-dev-qa-db-fra.com

Vérification de l'appel de fonction et inspection des arguments en utilisant sinon des espions

Je voudrais vérifier que bar() est appelée dans foo() à partir de mon test unitaire.

J'ai pensé que Sinon espions pourrait convenir, mais je ne sais pas comment les utiliser.

Existe-t-il un moyen de vérifier que la méthode est appelée? Peut-être même extraire les arguments utilisés dans l'appel bar()?

var spy = sinon.spy(foo);

function foo(){
    bar(1,2,3);
}

function bar(){ }

foo();

// what to do with the spy?

http://jsfiddle.net/8by9jg07/

22
filur

Dans votre cas, vous essayez de voir si bar a été appelé, vous voulez donc espionner bar plutôt que foo.

Comme décrit dans le doc :

function bar(x,y) {
  console.debug(x, y);
}
function foo(z) {
  bar(z, z+1);
}
// Spy on the function "bar" of the global object.
var spy = sinon.spy(window, "bar");

// Now, the "bar" function has been replaced by a "Spy" object
// (so this is not necessarily what you want to do) 

foo(1);

bar.getCall(0).args => should be [1,2]

Maintenant, espionner les internes de la fonction couple fortement votre test de "foo" à sa mise en œuvre, vous tomberez donc dans le débat habituel "mockist vs classique" .

29
phtrivier

Je suis d'accord avec Adrian en disant que vous vouliez probablement espionner le bar à la place.

var barSpy = sinon.spy(bar);

Puis pour vérifier qu'il a été appelé une fois

assert(barSpy.calledOnce);

Je viens d'appeler du tout

assert(barSpy.called)

Appelé x nombre de fois

assert.equal(barSpy.callCount, x);

Si vous souhaitez extraire les arguments du premier appel de l'espion:

var args = barSpy.getCalls()[0].args

Ensuite, vous pouvez faire ce que vous voulez avec ces arguments.

10
user1699348

Ne devriez-vous pas espionner le bar plutôt que le foo?

var spy = sinon.spy(bar)

Appelez foo:

foo()

La barre de contrôle a été appelée:

console.log(spy.calledOnce)
1
Adrian Lynch