Verwenden Sie sinon.js, um ein "Spionageobjekt" mit Spionagemethoden zu erstellen, die auf einem echten Konstruktor / Prototyp basieren

Ich benutze sinon.js, um Abhängigkeiten in meinen Mokka-Tests zu erkennen. Ich bevorzuge den "Spion" -Ansatz gegenüber einem klassischen Scheinansatz, da die Selbstbeobachtung des Spions klarer und flexibler erscheint als das etwas rückständige Denken mit klassischen Scheinobjekten.

Trotzdem frage ich mich, ob ich es falsch verwende, wenn es darum geht, Testspione für ganze Objekte zu erstellen. Angenommen, ich habe eine Testabhängigkeit mit 4 Methoden, und ich möchte jede dieser Methoden entfernen und Aussagen zu einer oder zwei davon machen. Derzeit mache ich das:

var spyObj = {
  aMethod: sinon.spy(),
  otherMethod: sinon.spy(),
  whatever: sinon.spy()
};

Dann frage ich einfach Dinge wiespyObj.aMethod.calledWith(a, b, c).

Gibt es eine bessere Möglichkeit, eine ganze Klasse zu verspotten, als die Namen der Methoden in der Testsuite selbst zu wiederholen? Es sieht so aus, als würde sinon.stub () versuchen, das gesamte Element eines bestimmten Objekts zu durchlaufen, aber dies scheint keine Möglichkeit zu sein, alle Methoden für die meisten Objekte in moderneren JS-Laufzeiten wie V8 abzurufen, sofern das Objekt nicht vorhanden ist ist eigentlich etwas aufzählbares. Es wird auch versucht, das eigentliche Objekt mit einem Affen zu patchen, anstatt ein gleichwertiges Objekt zurückzugeben, was etwas unerwünscht ist. Ich benötige nur ein Objekt, das einer Schnittstelle entspricht, sich aber wie ein Nullobjekt verhält, sofern ich nichts anderes verrate.

Es wäre gut, in der Lage zu sein, etwas zu tun wie:

var spyObject = sinon.spy(MyClass.prototype);

Wie findet man alle Methoden eines Konstruktors / Prototyps in Node.js, um einen Wrapper wie den oben genannten zu erstellen?

Hier geht es mehr darum, Logik auszulöschen, als Aufrufe mit einer Vielzahl von Methoden zu testen (die ich auf eine oder zwei beschränken möchte). Zum Beispiel Dinge, die unerwünschte E / A-Vorgänge verursachen oder bei deren Ausführung zusätzliche komplexe Fixtures erforderlich sind.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage