2017-03-17 98 views
3

我想測試一個使用WebSocket的庫。我試圖用下面的代碼來模擬websocket。圖書館ROSController使用網絡插座,但我不斷收到WebSocket is not defined.嘲笑Jest中的WebSocket

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

「jasmine」在哪裏申報? – jered

+0

在我的package.json中?我只是在項目的根部運行Jest。這是在scripts/__ tests__文件夾中。 Jest似乎運行良好,我只是無法拿起WebSocket變量 – cjds

回答

3

在開玩笑,你需要的東西,應該在全球範圍內又名window可用,添加到global命名空間:

global.WebSocket= WebSocket 
+0

這不適合我。我已經在測試設置和單元測試中將WebSocket添加到全局範圍。在這兩種情況下,我得到一個'ReferenceError:WebSocket沒有定義' –

3

使用mock-socket包,然後global以使其可用於的NodeJS:

import { WebSocket } from 'mock-socket'; 

global.WebSocket = WebSocket;