2017-09-13 6 views
1

Tout d'abord, j'essaie de tester la seconde fois qu'une fonction appelée renvoie la valeur correcte. Pour être plus précis, j'essaie de tester la seconde fois qu'un événement est reçu par socket.on() renvoie la valeur correcte.Comment tester les événements socket.io qui sont appelés avec sinon.spy

Je sais que Sinon.spy() peut détecter si une fonction est appelée ou non. Mais il ne semble pas fonctionner avec les événements socket.io.

Je suis en train de tester par exemple,

var socketio = io.connect(someUrl); 
socketio.on(eventName, cb); 

si le 'eventName' est appelé. J'ai essayé

var spy = sinon.spy(socketio, 'on'); 
assert(spy.withArgs(eventName).called); 

Mais il est dit qu'il ne sera jamais appelé.

De plus, si je voudrais tester les données dans la fonction de rappel est juste ou non, par exemple

var socketio = io.connect(someUrl); 
socketio.on(eventName, function(data) { 
    data.should.equal(something); 
}); 

Est-il possible de tester cela?

Mise à jour:

J'ai résolu le problème en ajoutant un compte dans le rappel

var count = 0; 
socketio.on(eventName, function(data) { 
    count++; 
    if(count === 2) { 
     data.should.equal(something) 
    } 
} 

Mais je pense que c'est une façon aki, est-il un moyen standard/intelligent pour le faire (si possible en utilisant sinon)?

+0

Y at-il une faute de frappe dans votre connecter l'exemple? l'espion n'a pas la méthode 'withArg' - devrait être' withArgs' –

+0

@TristanHessell désolé c'est une faute de frappe – Keming

Répondre

1

Vous ne voulez pas espionner on - ce n'est appelé qu'une seule fois, au moment de la configuration de l'écouteur. (À moins que vous ne vouliez réellement espionner pour voir si les auditeurs sont en train de se mettre en place, et ne se soucient pas de savoir s'ils sont effectivement utilisés.) Cela ne semble pas être ce que vous voulez.)

vous voulez espionner la fonction de rappel cb, pour voir si et comment elle s'exécute.

var callbackSpy = sinon.spy(cb); 

Ensuite, passer cet espion en tant que rappel:

socketio.on(eventName, callbackSpy); 

Et test si le rappel n'a jamais été exécuté avec la valeur de l'argument souhaité:

assert(callbackSpy.calledWith(something)); 
+0

Merci beaucoup! Cela efface ma confusion à propos de sinon.spy. Mais comment dois-je tester si le rappel est appelé deux fois et recevoir les données correctes la deuxième fois appelé? – Keming

+0

@Keming Voir http://sinonjs.org/releases/v2.0.0/spies/ Vous pouvez faire 'callbackSpy.getCall (1) .args [0] === something' pour tester le premier argument de la seconde (index '1') appel – apsillers