Use sinon.js para criar um "objeto espião" com métodos de espionagem baseados em um construtor / protótipo real

Eu estou usando sinon.js como uma maneira de eliminar dependências em meus testes Mocha. Eu prefiro a abordagem do 'espião' em relação a uma clássica abordagem simulada, já que a introspecção do espião parece mais clara e oferece mais flexibilidade do que o pensamento um tanto atrasado com objetos falsos clássicos.

Dito isso, gostaria de saber se estou usando incorretamente quando se trata de criar espiões de teste para objetos inteiros. Digamos que eu tenha uma dependência de teste que tenha 4 métodos nela e quero descartar cada um desses métodos e fazer asserções em um ou dois deles. Atualmente estou fazendo isso:

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

Então eu só peço coisas comospyObj.aMethod.calledWith(a, b, c).

Existe uma maneira melhor de ridicularizar uma turma inteira do que repetir os nomes dos métodos no próprio conjunto de testes? Parece que sinon.stub () tenta iterar sobre todo o membro de um dado objeto, mas isso não parece funcionar como uma forma de obter todos os métodos para a maioria dos objetos em tempos de execução JS mais modernos, como o V8, a menos que o objeto é realmente algo enumerável. Ele também tenta manipular o objeto real, em vez de retornar um objeto equivalente, o que é um pouco indesejável. Eu só preciso de um objeto que está em conformidade com uma interface, mas se comporta como um objeto nulo, a menos que eu diga o contrário.

Seria bom poder fazer algo como:

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

Como se encontram todos os métodos de um construtor / protótipo no Node.js, para criar um wrapper como o acima?

Trata-se mais de esquematizar a lógica, do que testar invocações em muitos métodos (que eu tento limitar a um, ou a um push dois). Por exemplo, coisas que podem fazer E / S indesejadas ou exigir equipamentos complexos adicionais, se executados.