2016-05-04 15 views
0

Ich versuche, einen Socketcluster-Client zu stubben, um Ereignisse an den Socketserver zu emittieren.Stubbing ein Socket-Client mit Sinon

i halten die unten Fehler von Sinon bekommen

TypeError: socket.emit is not a function 

das ist meine Testsuite

import {expect} from 'chai'; 
import sinon from 'sinon' 
import io from 'socketcluster-client'; 
import testServer from '../../server/server.js'; 

describe('httpServer',() => { 


    beforeEach(() => { 
    testServer(4000) 
    }) 

    it('should respond to the ping event',() => { 
    var socket =sinon.stub(io,'connect') 

    var message = 'house' 
    socket.emit('ping',message); 
    }) 

})

die Verbindungsfunktion muss in der Regel mit einem Argumente Spezifizierungs aufgerufen werden der Port io.connect ({Anschluss: 4000})

h wie störe ich das mit sinon?

ich würde idealerweise Veranstaltungen wie vom Stummel auszusenden meine Server-Antwort

Antwort

1

Sie möchten zu überprüfen, sinon.spy() verwenden, nicht sinon.stub(). Ersteres wird die ursprüngliche Funktion aufrufen, letzteres nicht.

Zitat von the documentation:

Wenn eine vorhandene Funktion mit einem Stummel Einwickeln, wird die ursprüngliche Funktion nicht aufgerufen.

Sie müssen auch sicherstellen, dass Sie es tatsächlich auch aufrufen, was Ihr aktueller Code nicht zu tun scheint.

EDIT: von Ihren Kommentaren scheint es, dass alles, was Sie tun möchten, ist ein Client ausführen, einige Nachrichten an den Server senden und überprüfen, ob der Server richtig reagiert. Sie brauchen keine Spione/Stubs dafür.

Ich weiß nicht, socketcluster, aber eine Idee zu geben, wie sie umgesetzt werden kann, hier ist ein Beispiel eines einfachen HTTP-Server:

describe('httpServer',() => { 

    before((done) => { 
    http.createServer((req, res) => { 
     res.end(req.url === '/ping' ? 'PONG' : 'HELLO WORLD'); 
    }).listen(4000, done); 
    }); 

    it('should respond to the ping event', (done) => { 

    http.get('http://localhost:4000/ping', (res) => { 
     let buffers = []; 

     res.on('data', (d) => buffers.push(d)) 
     .on('end',() => { 
      let body = Buffer.concat(buffers); 
      expect(body.toString()).to.equal('PONG'); 
      done(); 
     }); 
    }); 

    }); 
}); 

(es ist ein minimales Beispiel, wie es nicht der Fall ist auf Fehler überprüfen oder den HTTP-Server bereinigen, nachdem die Tests abgeschlossen sind)

+0

etwas ähnliches? http://pastebin.com/iym6Fe2v - ich bin mir nicht sicher, ob ich tatsächlich tdd auf dem richtigen Weg bin. Ist das der richtige Weg, einen Socket-Server zu testen, indem man einen Socket-Client stößt/ausspioniert? – Kannaj

+0

Fangen wir am Anfang an: Was genau wollen Sie testen? :-D Spies/Stubs sind dazu gedacht, bestehende Funktionen/Methoden zu "haken", um zu sehen, ob sie mit bestimmten Argumenten aufgerufen werden oder dass Aufrufer dieser Funktionen/Methoden auf bestimmte Bedingungen richtig reagieren. – robertklep

+0

Ich möchte ein "Ping" -Ereignis vom Client aus senden und prüfen, ob der Server korrekt auf das Ereignis 'ping' reagiert (gib 'pong' zurück, oder erre abhängig von der Nutzlast). Der Grund, warum ich stub/spy verwenden wollte, bestand darin, nur die Serverantwort und nicht den Client zu testen. – Kannaj