Websocket 使用带有模拟套接字的Cypress`

Websocket 使用带有模拟套接字的Cypress`,websocket,mocking,cypress,Websocket,Mocking,Cypress,我正在尝试使用Cypress的mock sockets,在onBeforeLoad钩子中为我的beforeach块中的cy.visit()设置mock。我可以让一个测试正常工作,但是当模拟安装程序在每个测试之前的下一个上运行时,我得到一个错误,模拟服务器已经在侦听此url 测试中的代码: (从我的React应用程序的组件didimount调用) subscribeToSettings(url:string):W3CWebSocket{ let settingsSubscription=新的W3C

我正在尝试使用Cypress的
mock sockets
,在
onBeforeLoad
钩子中为我的
beforeach
块中的
cy.visit()
设置mock。我可以让一个测试正常工作,但是当模拟安装程序在每个测试之前的下一个
上运行时,我得到一个错误,
模拟服务器已经在侦听此url

测试中的代码: (从我的React应用程序的
组件didimount
调用)

subscribeToSettings(url:string):W3CWebSocket{
let settingsSubscription=新的W3CWebSocket(url);
settingsSubscription.onopen=()=>console.log('WebSocket客户端已连接(设置)');
settingsSubscription.onclose=()=>console.log('WebSocket客户端已断开连接(设置)');
settingsSubscription.onmessage=(消息:MessageEvent)=>this.handleSettingsMessage(消息);
返回设置订阅;
}
/**
*websocket设置消息的处理程序,用于更新本地设置值。
*@param消息websocket消息
*/
handleSettingsMessage(消息:MessageEvent){
const updatedValues=JSON.parse(message.data);
console.log('在设置频道上收到消息',updatedValues);
this.props.updateSettingsFromBackend(updatedValues);
}
柏树试验
从“模拟套接字”导入{Server}
从“./../src/reducers/settings.reducer”导入{defaultSettingsState}”;
从“./../src/actions/settings.actions”导入{U createSettingsApiPutPayload}”;
描述('模拟套接字方法1',()=>{
让我们来模拟插座;
让mockServer;
在每个之前(()=>{
cy.visit(“/”{
onBeforeLoad(赢:窗口):无效{
//@ts忽略
cy.stub(win,'WebSocket',url=>{
mockServer=新服务器(url)
mockServer.on('connection',socket=>{
log('mock socket connected');
mockSocket=socket;
});
mockSocket=新的WebSocket(url);
返回模拟插座
});
},
});
});
之后(()=>{
mockSocket.close()
mockServer.stop()
});
它('获取消息',()=>{
cy.contains('SETTINGS')。单击()
常量对象=_createSettingsApiPutPayload(defaultSettingsState)
发送(JSON.stringify(object));
cy.contains('运动阈值')
});
它('获取另一条消息',()=>{
cy.contains('SETTINGS')。单击()
常量对象=_createSettingsApiPutPayload(defaultSettingsState)
发送(JSON.stringify(object));
cy.contains('运动阈值')
});
});
以下是来自我的控制台的日志:

WebSocket Client Connected (settings)
mock socket connected at url ws://localhost:8702/PM_Settings
A message was received on the settings channel. {…}
mock socket connected at url ws://localhost:3000/sockjs-node/949/mhuyekl3/websocket
The development server has disconnected.
Refresh the page if necessary.
Uncaught Error: A mock server is already listening on this url
我想知道这是否与第二个电话有关,这是为了某个神秘的url

(注意:调用
cy.contains('SETTINGS')。在每次
之前的
末尾单击()
,即使在第一次测试中,也不起作用。即使在设置页面上设置了我的应用程序启动(而不必从测试内部单击它),在每次之前单击
中的
设置
仍然不起作用,即使我们已经在那里了。所以这有点奇怪)

这些cypress日志也可能有帮助:

当我将服务器停止移动到
WebSocket
存根时,它只对我有效:

cy.stub(窗口'WebSocket',url=>{
if(mockServer){
mockServer.stop();
}
mockServer=新服务器(url);
mockServer.on('connection',socket=>{
mockSocket=socket;
});
mockSocket=新的WebSocket(url);
返回模拟插座;
});

我可能错了,但我猜每次之后都是
mockServer.stop()是异步的这就是为什么模拟服务器在新初始化之前无法停止的原因嗨,你找到解决方案了吗?