2017-03-17 50 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;