Spy and callThrough native WebSocket constructor with Jasmine

谁都会走 提交于 2019-12-22 13:59:00

问题


I'm trying to spy on native WebSocket constructor, so I wrote:

it("should spy and call through WebSocket constructor", function (done) {
  var WSspy = spyOn(window, "WebSocket").and.callThrough();

  var ws = new WebSocket("ws://some/where");

  expect(WSspy).to.toHaveBeenCalledWith("ws://some/where");
});

but it results in error:

TypeError: Failed to construct 'WebSocket': Please use the 'new' operator, this DOM object constructor cannot be called as a function.

How should I callThrough such constructor?


回答1:


I found a workaround with callFake:

it("should spy and callFake WebSocket constructor", function (done) {
  var realWS = WebSocket;  
  var WSSpy = spyOn(window, "WebSocket").and.callFake(function(url,protocols){
    return new realWS(url,protocols);
  });        

  var ws = new WebSocket("ws://some/where");

  expect(WSSpy).toHaveBeenCalledWith("ws://some/where");
  done();
});

It works quite fine, but it overwrites the WebSocket.prototype so make sure you use it or save the reference before creating the spy, like

var realWS = WebSocket;  
var messageSpy = spyOn(WebSocket.prototype, "close").and.callThrough();      
var WSSpy = spyOn(window, "WebSocket").and.callFake(function(url,protocols){
  return new realWS(url,protocols);
});    


来源:https://stackoverflow.com/questions/28548329/spy-and-callthrough-native-websocket-constructor-with-jasmine

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!