Utilisation sinon.js pour créer un “espion objet” avec spy méthodes basées sur un réel constructeur/prototype

Je suis en utilisant sinon.js comme un moyen d'écraser les dépendances dans mon Moka tests. Je préfère le 'espion' approche sur un classique de la maquette approche, comme l'introspection de l'espion semble plus clair et offre plus de souplesse que le un peu vers l'arrière-pensée classique avec des objets fantaisie.

Cela dit, je me demande si je l'utilise de manière incorrecte lorsqu'il s'agit de la création d'essai d'espionnage en faveur de l'ensemble des objets. Disons que j'ai un test de dépendance qui a 4 méthodes et je veux la stub de chacune de ces méthodes et de faire des assertions sur l'un ou deux d'entre eux. Actuellement, je suis en train de faire ceci:

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

Puis-je demander des choses comme spyObj.aMethod.calledWith(a, b, c).

Est-il une meilleure façon de se moquer de toute une classe que de répéter les noms des méthodes utilisées dans la suite de test lui-même? Il ressemble sinon.stub() essaie de parcourir tous les états d'un objet donné, mais qui ne semble pas le travail comme un moyen d'obtenir toutes les méthodes pour la plupart des objets plus modernes JS runtimes, comme les V8, sauf si l'objet est en fait quelque chose de énumérable. Il tente également de monkey patch de l'objet réel, plutôt que de retourner l'équivalent d'une, qui est pour le moins indésirables. J'ai juste besoin d'un objet qui est conforme à une interface, mais se comporte comme un objet nul, à moins que je dis c'est le contraire.

Il serait bon d'être en mesure de faire quelque chose comme:

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

Comment trouver toutes les méthodes d'un constructeur/prototype Node.js afin de faire un wrapper comme ci-dessus?

C'est plus sur déraciner logique, que de tester les invocations sur beaucoup de méthodes (dont j'essaie de limiter à l'un ou à une pression d'un des deux). Par exemple, des choses qui pourraient ne indésirables I/O, ou besoin de plus complexe montages si elle est exécutée.

OriginalL'auteur d11wtq | 2012-08-19