2017-07-19 1 views
1

qui suit:Comment puis-je remplacer une fonction anonyme dans Sinon?

const sinon = require('sinon') 

const a =() => { return 1 } 
sinon.stub(a) 

lancers francs TypeError: Attempted to wrap undefined property undefined as function.

stub fonctionne s'il y a un objet, donc j'ai essayé d'utiliser this. Dans Node.js REPL (v6.11):

> const a =() => { return 1 } 
undefined 
> this.a 
[Function: a] 

Cependant, dans mon spec mocha, il échoue:

const a =() => { return 1 }           

console.log(a) 
// => [Function: a] 

console.log(this.a) 
// => undefined 

Qu'est-ce que je manque? Comment puis-je faire ce travail?

BTW: Je suis conscient que je peux stub une méthode d'un objet, comme ceci: const stub = sinon.stub(object, 'a'), mais ce n'est pas ce que je suis après ici avec cette question.

+0

double possible de [TypeError: Tentative d'envelopper propriété non définie en fonction] (https://stackoverflow.com/ questions/42271151/typeerror-tenté-à-wrap-undefined-propriété-comme-fonction) –

+0

Pas vraiment un doublon. Ce n'est pas sur les setters/getters. –

+1

Vous ne pouvez pas le faire fonctionner comme ça. Pour le stubbing, Sinon demande un objet racine car il doit remplacer la référence de la fonction que vous souhaitez placer dans cet objet racine. Le 'this' dans le REPL ne fonctionne que parce que le REPL est implémenté. – robertklep

Répondre

2

Vous ne pouvez pas le faire fonctionner comme ça. Pour le stubbing, Sinon requiert un objet racine "" car il doit remplacer la référence de la fonction que vous voulez placer dans cet objet racine. Le this dans le REPL ne fonctionne que parce que le REPL est implémenté. Dans le dernier noeud (v8), il ne lie plus automatiquement les fonctions à this comme décrit.

sinon.stub prend dans un objet, puis vous pouvez remplacer les propriétés. Donc, vous devriez être en mesure de faire

const obj = { 
    a: (() => return 1; }) 
}; 

et être en mesure d'appeler

const stub = sinon.stub(obj, "a"); 

Comme vous avez été témoin, vous définissez const a être une fonction dans votre exemple - il doit être un objet et alors sinon peut remplacer une propriété spécifique dans cet objet. Je crois que la raison en est que cela lui donne alors quelque chose que je peux référencer, donc pourquoi sinon peut aussi supporter des choses comme object.method.restore().

Une autre solution consiste à se lier à this sur votre propre (bien que ce n'est pas recommandé):

const a =() => { return 1 } 
this.a = a; 

sinon.stub(this, 'a').returns(2); 
console.log(this.a()); 
// => 2 
+0

Oui, je suis conscient que vous pouvez remplacer les méthodes d'un objet. Mais je voudrais comprendre pourquoi je ne peux pas le faire sans avoir l'objet en place comme cela avait l'habitude de travailler dans les versions antérieures de Sinon. –

+1

@ PawełGościcki 'sinon.stub (fn)' ne fonctionne pas non plus dans les anciennes versions de Sinon. Voulez-vous dire 'sinon.spy (fn)'? – robertklep

+0

Cela fonctionnait comme ça dans la journée. Voici un lien archéologique: http://sinon.readthedocs.io/en/master/Stubs.html –