2013-10-09 4 views
9

Ich möchte Web Sockets testen, die mit sockjs implementiert wurden.So testen Sie Web Sockets - JavaScript

var sock = new SockJS('http://mydomain.com/my_prefix'); 
    sock.onopen = function() { 
     console.log('open'); 
    }; 
    sock.onmessage = function(e) { 
     console.log('message', e.data); 
    }; 
    sock.onclose = function() { 
     console.log('close'); 
    }; 

Ich glotzte und fand nur diese article. Das ist nicht gut genug, weil es tatsächlich eine Verbindung herstellt, anstatt es vorzutäuschen.

Ich habe auch SO versucht, aber nur eine unbeantwortete Frage here gefunden.

Jemand hat sinonjs vorgeschlagen, aber ich kann kein anständiges Beispiel finden.

Ich freue mich, wenn jemand etwas zu diesem Thema beleuchten kann.

Antwort

3

Wenn Sie ein Feature testen möchten, das auf eine externe Ressource zugreift, wie in Ihrem Fall ein Websocket-Server, besteht der übliche Ansatz darin, ein Mock-Objekt zur Darstellung der externen Ressource zu verwenden. Ein Scheinobjekt ist ein Objekt, das wie die externe Ressource aussieht und sich verhält, aber nicht darauf zugreift. Darüber hinaus kann es über Protokollfunktionen verfügen, mit denen es dem Testcode Bericht erstatten kann, wenn sich der getestete Code wie erwartet verhält.

In Ihrem Fall würden Sie ein Mock-SockJS Objekt erstellen, die die relevanten Eigenschaften und Methoden eines normalen SockJS alle Objekt hat, aber die Umsetzung nicht in Kontakt mit tatsächlich einen Server. Es protokolliert nur die Methodenaufrufe und gibt die erwartete Antwort zurück, die ein vorhandener Server senden würde.

Dann würden Sie den Code Refactoring wollen Sie so testen, dass es nicht die Steckdose selbst nicht schaffen, sondern erhalten stattdessen ein Objekt-Buchse von außen zugewiesen (dies wird als „dependency injection“ und ist ein entscheidendes Idiom für das Schreiben von fonds- testbarer Code).

In Ihrem echten Code weisen Sie ein echtes SockJS-Objekt zu. Aber in Ihrem Unit-Test weisen Sie Ihr Mock-Objekt zu. Nachdem Sie Ihre Testmethoden aufgerufen haben, können Sie das Mock-Objekt untersuchen, um zu überprüfen, ob das Gerät die erwarteten Daten an den Server gesendet hat.

+2

Dank für das Feedback, es sieht aus wie eine Menge Arbeit. Ich suche etwas Fertiges. ZB hat Jasmin alle Werkzeuge, um gefälschte AJAX-Anrufe zu erstellen. Web-Sockets werden immer beliebter. Gibt es irgendeine Bibliothek, die mir diese Mock-Objekte aus der Box gibt? –

+2

@ user2855314 Jasmin implementiert Mock-Objekte als Dekoratoren um tatsächliche Objekte. Seine Terminologie dafür ist "Spy". Die 'SpyOn' Methode kann mit einem Aufruf an' andCallFake (Funktion) 'welche Delegierten die Methode-Aufruf an eine eigene Implementierung verkettet werden. Dies verhindert, dass das Objekt tatsächlich versuchen, einen Server zu kontaktieren und stattdessen zurück, was Ihre Implementierung zurückkehrt. – Philipp

+1

@Philipp, können Sie geben Sie bitte kein Beispiel dafür? –