2017-09-24 3 views
0

Ich habe ein paar verwandte Fragen gefunden, aber keine scheint zu helfen, was ich implementieren möchte.Sinon - Spion auf Konstruktor Methode

Also möchte ich eine Konstruktormethode ausspionieren, so dass, wenn ein Objekt mit dem Konstruktor erstellt diese Methode innerhalb einen anderen Bereich eine andere Funktion ruft, kann ich die Argumente kennen, mit denen dieser Aufruf gemacht wurde.

Beispiel:

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 

Jede Hilfe wird sehr geschätzt.

Edit: Ich erkannte ich die Frage falsch formuliert und am Ende etwas ganz trivial :-)

fragen
+0

Ich habe gerade gesehen, was Sie hinzugefügt haben. Es ist nicht möglich, in Ihrer 'console.log (Constructor.method.args [0]);' Methode als statische Funktion zu verwenden, was nicht der Fall ist. Stellen Sie sich vor, Sie hätten 5 verschiedene Konstruktoren instanziiert. –

Antwort

1

Auf diese Weise können Sie über Constructor.method auszuspionieren:

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' ] 

Aber tun, wie Sie sagen, ist unmöglich, Sie können nicht eine statische Methode und eine Klassenmethode mit dem gleichen Namen haben, und was ist, wenn Sie diese Klasse mehr als einmal instanziieren ... Wie auch immer, das Beste, womit ich kommen kann, ist eine Lösung mit Proxy für Konstruktoren :

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'] 

Sie können diesen Code in eine Datei einfügen und es versuchen. Manchmal müssen Sie beim Schreiben von Tests Ihren Code umgestalten, um ihn testbar zu machen, oder Sie können mit dem Schreiben der Tests beginnen, bevor Sie Ihren Code (TDD) schreiben.

+0

Danke für Ihre Antwort. In Ihrem Beispiel befindet sich die Datei console.log jedoch im selben Bereich wie die obj-Deklaration. Was ich tun möchte, ist zu wissen, ob die Methode auch in einem Bereich aufgerufen wurde, der nicht zugänglich ist ... – Nfys

+0

Ich habe meine Antwort aktualisiert, bitte sehen Sie. –

Verwandte Themen