Utilice sinon.js para crear un "objeto espía" con métodos de espía basados ​​en un constructor / prototipo real

Estoy usando sinon.js como una forma de eliminar dependencias en mis pruebas de Mocha. Prefiero el enfoque de "espía" en lugar de un enfoque simulado clásico, ya que la introspección del espía parece más clara y ofrece más flexibilidad que el pensamiento retroactivo con los objetos simulados clásicos.

Dicho esto, me pregunto si lo estoy usando incorrectamente cuando se trata de crear espías de prueba para objetos completos. Digamos que tengo una dependencia de prueba que tiene 4 métodos y quiero eliminar cada uno de esos métodos y hacer afirmaciones en uno o dos de ellos. Actualmente estoy haciendo esto:

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

Entonces solo pregunto cosas comospyObj.aMethod.calledWith(a, b, c).

¿Hay una forma mejor de burlarse de toda una clase que repetir los nombres de los métodos en el conjunto de pruebas? Parece que sinon.stub () intenta iterar sobre todos los miembros de un objeto dado, pero eso no parece funcionar como una forma de obtener todos los métodos para la mayoría de los objetos en tiempos de ejecución JS más modernos, como V8, a menos que el objeto En realidad es algo enumerable. También trata de parchear el objeto real, en lugar de devolver uno equivalente, que es algo indeseable. Solo necesito un objeto que se ajuste a una interfaz, pero se comporte como un objeto nulo, a menos que le diga lo contrario.

Sería bueno poder hacer algo como:

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

¿Cómo se pueden encontrar todos los métodos de un constructor / prototipo en Node.js, para hacer una envoltura como la anterior?

Esto se trata más de apagar la lógica, que de probar invocaciones en muchos métodos (que trato de limitar a uno, o al empujar dos). Por ejemplo, las cosas que pueden hacer E / S no deseadas, o requerir accesorios complejos adicionales si se ejecutan.

Respuestas a la pregunta(2)

Su respuesta a la pregunta