在Jest中嘲笑WebSocket

cjd*_*jds 10 javascript reactjs jestjs

我正在尝试测试使用WebSockets的库.我正在尝试使用下面的代码来模拟websocket.该库ROSController使用Web套接字,但我一直在使用WebSocket is not defined.

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(){}));

});
Run Code Online (Sandbox Code Playgroud)

Mar*_*las 11

使用mock-socket包然后global使其可用于nodejs:

import { WebSocket } from 'mock-socket';

global.WebSocket = WebSocket;
Run Code Online (Sandbox Code Playgroud)

  • 我以前使用过“mock-socket”,我强烈建议人们避免使用它。它没有得到真正的维护,并且存在各种错误(其中许多错误已经存在多年)。我还没有找到更好的替代方法来编写自己的模拟实现,但每次我不得不花的时间都比解决“模拟套接字”中的问题要少 (3认同)

And*_*rle 8

开玩笑地说,您需要将在全局范围 aka 中应该可用的内容添加windowglobal命名空间:

global.WebSocket= WebSocket
Run Code Online (Sandbox Code Playgroud)