我不完全确定我是否弄清楚你的代码应该如何表现,但如果你需要监视WebSocket
构造函数和存根.send
方法来模拟一些传入消息,以下是如何实现它。
监视WebSocket
你需要打电话.and.callThrough
而不是returnValue
。然而,这导致了人们抱怨缺乏new
关键字(如here),所以你需要伪造构造函数:
var realWS = WebSocket;
var WebSocketSpy = spyOn(window, "WebSocket").and.callFake(function(url,protocols){
return new realWS(url,protocols);
});
要监视传入消息,您可以简单地执行以下操作
var onmessageCallbackSpy = jasmine.createSpy('onmessageCallback');
你还可以窥探.send
方法,并提供一些模拟响应:
var sendSpy = spyOn(WebSocket.prototype, "send").and.callFake(function(outMsg){
// process/check outgoing message
// setTimeout, or call it immediately
this.onmessage("mock message goes here");
});
但一定要使用WebSocket.prototype
,在您将其替换为WebSocketSpy
.
完整的工作示例应该如下所示:
it("should spy and callFake WebSocket constructor, and stub prototype methods", function (done) {
var realWS= WebSocket;
var sendSpy = spyOn(WebSocket.prototype, "send").and.callFake(function(outMsg){
if(outMsg == "outgoing message"){
this.onmessage("incoming mocked message goes here");
}
});
// var messageSpy = spyOn(WebSocket.prototype, "onmessage");//.and.returnValue("mock message goes here");
var WSSpy = spyOn(window, "WebSocket").and.callFake(function(url,protocols){
return new realWS(url,protocols);
});
var onmessageCallbackSpy = jasmine.createSpy('onmessageCallback');
// Your code
// (function init(url, onmessageCallbackSpy){
var ws = new WebSocket("ws://some/where");
ws.onmessage = onmessageCallbackSpy;
// code that results with receiving a message
// or mocked send, that calls `.onmessage` immediately
ws.send("outgoing message");
// })();
expect(WSSpy).toHaveBeenCalledWith("ws://some/where");
expect(onmessageCallbackSpy).toHaveBeenCalledWith("mock message goes here");
done();
});