2017-09-24 1 views
0

J'ai trouvé quelques questions connexes mais aucune ne semble aider avec ce que je veux implémenter. Donc, je voudrais espionner une méthode constructeur de sorte que lorsqu'un objet créé avec le constructeur appelle cette méthode dans une autre portée une autre fonction, je peux connaître les arguments avec lesquels cet appel a été fait.Sinon - méthode du constructeur espion

Exemple:

function Constructor(args){ 
    this.method = sinon.spy() 
} 

function someFunction(){ 
    obj = new Constructor(args); 
    obj.method() 
} 

console.log(Constructor.method.args[0]); // list the args of the obj.method() call 

Toute aide sera très appréciée.

Edit: Je réalisai que je formulerait la mauvaise question et a fini par demander quelque chose de totalement trivial :-)

+0

Je viens de voir ce que vous avez ajouté. Ce n'est pas possible, dans votre 'console.log (Constructor.method.args [0]);' vous utilisez la méthode comme une fonction statique, ce qui n'est pas le cas. Imaginez que vous ayez 5 constructeurs différents instanciés. –

Répondre

1

De cette façon, vous pouvez espionner sur Constructor.method:

function Constructor(args){ 
    this.method = function() {} 
} 

const obj = new Constructor(); 
obj.method = sinon.spy(obj.method); 
obj.method('someArg'); 

console.log(obj.method.args[0]); // [ 'someArg' ] 

Mais faites comme vous le dites est impossible, vous ne pouvez pas avoir une méthode statique et une méthode de classe avec le même nom, et aussi si vous instanciez cette classe plus d'une fois ... De toute façon le meilleur que je peux trouver est une solution avec Proxy sur le constructeur, comme ça :

function Constructor(args) { 
    this.method = function() {} 
} 

const ProxyConstructor = new Proxy(Constructor, { 
    construct: function (target, args, newTarget) { 
     const c = new target(...args); 
     const origMethod = c.method; 
     c.method = function (...args) { 
      ProxyConstructor.methodArgs = ProxyConstructor.methodArgs || []; 
      ProxyConstructor.methodArgs = ProxyConstructor.methodArgs.concat(args) 
      origMethod(...args); 
     }; 
     return c; 
    } 
}); 


function someFunction() { 
    obj = new ProxyConstructor(); 
    obj.method('test') 
} 

someFunction(); 
console.log(ProxyConstructor.methodArgs); // ['test'] 

Vous pouvez coller ce code dans un fichier et l'essayer. De même, lors de l'écriture de tests, vous devrez peut-être refactoriser votre code pour le rendre testable, ou vous pourriez commencer par écrire les tests avant d'écrire votre code (TDD).

+0

Merci pour votre réponse. Cependant, dans votre exemple, console.log est sur la même portée avec la déclaration obj. Ce que je voudrais faire, c'est savoir si la méthode a été appelée même dans une portée qui n'est pas accessible ... – Nfys

+0

J'ai mis à jour ma réponse, jetez un oeil. –