2017-03-17 2 views
3

Ich versuche, eine Bibliothek zu testen, die WebSockets verwendet. Ich versuche, den Websocket mit dem folgenden Code zu verspotten. Die Bibliothek ROSController nutzt Web Sockets, aber ich halte das im Scherz WebSocket is not defined.Mocking WebSocket in Jest

import { ROSController } from '../ROSController.jsx'; 
var socketMock; 
var windowMock; 
var address = 'ws://test.address'; 

beforeAll(function() { 
    var WebSocket = jasmine.createSpy(); 
    WebSocket.and.callFake(function (url) { 
     socketMock = { 
     url: url, 
     readyState: WebSocket.CONNECTING, 
     send: jasmine.createSpy(), 
     close: jasmine.createSpy().and.callFake(function() { 
      socketMock.readyState = WebSocket.CLOSING; 
     }), 

     // methods to mock the internal behaviour of the real WebSocket 
     _open: function() { 
      socketMock.readyState = WebSocket.OPEN; 
      socketMock.onopen && socketMock.onopen(); 
     }, 
     _message: function (msg) { 
      socketMock.onmessage && socketMock.onmessage({data: msg}); 
     }, 
     _error: function() { 
      socketMock.readyState = WebSocket.CLOSED; 
      socketMock.onerror && socketMock.onerror(); 
     }, 
     _close: function() { 
      socketMock.readyState = WebSocket.CLOSED; 
      socketMock.onclose && socketMock.onclose(); 
     } 
     }; 
     return socketMock; 
    }); 
    WebSocket.CONNECTING = 0; 
    WebSocket.OPEN = 1; 
    WebSocket.CLOSING = 2; 
    WebSocket.CLOSED = 3; 
    windowMock = { 
     WebSocket: WebSocket 
    }; 

    return WebSocket; 
}); 

test('the subscription JSON produced is correct',() => { 
    console.log(WebSocket); //<----- It fails here 
    JSON.parse((new ROSController('')).callService('/test','', function(){})); 

}); 
+0

Wo wird 'Jasmin' deklariert? – jered

+0

In meinem Paket.json? Ich lasse Jest einfach an der Wurzel des Projekts laufen. Dies ist im Ordner scripts/__ Tests__. Jest scheint gut zu laufen, ich kann einfach nicht die WebSocket Variable – cjds

Antwort

3

bekommen, müssen Sie Sachen hinzufügen, die im globalen Bereich aka window, zum global Namensraum zur Verfügung stehen sollen:

global.WebSocket= WebSocket 
+0

abholen Das funktioniert nicht für mich. Ich habe WebSocket zum globalen Gültigkeitsbereich sowohl im Test-Setup als auch im Komponententest hinzugefügt. In beiden Fällen bekomme ich einen 'ReferenceError: WebSocket ist nicht definiert' –

3

Verwenden mock-socket Paket und dann global um es für NodeJS zur Verfügung zu stellen:

import { WebSocket } from 'mock-socket'; 

global.WebSocket = WebSocket;