reactjs - 如何使用 Jest 和 react-testing-library 测试 Websocket 客户端

标签 reactjs websocket mocking jestjs react-testing-library

我正在使用 create-react-app、Jest 和 react-testing-library 来配置聊天机器人项目。

例如,我有一个连接到 WebSocket 服务器的 React 功能组件,并且 DOM 会根据 WebSocket 消息进行更改

const LiveChat = () => {
  const [socket, setSocket] = useState(null)

   useEffect(() => {
    setSocket(new WebSocket('ws://localhost:1234'))
   }, [])

  useEffect(() => {
    socket && socket.onmessage = message => { handleAgentMessages(message.data) }
  }, [socket])

  const handleAgentMessages = message => {
     const { messageContent, messageType, secureKey } = JSON.parse(message)
     if (messageType === TEXT && messageContent) {
       alert(messageContent)
       playChatMessageSound()
     }
       ...
   }

   return (
      <div className='live-chat' data-testid='live-chat'>
          ...
      </div>
   )
}

我想测试何时出现 TEXT 消息,是否出现警告框并带有 conteining 消息等。我浏览了互联网,发现 jest-websocket-mock库,但似乎我也需要用这个库来模拟客户端,但我只想模拟服务器并期望客户端连接模拟的 WebSocket 服务器,你有什么想法吗?

最佳答案

我不确定这是否是正确的方法。但这对我有用,

    global.sendMsg = null;
    global.WebSocket = class extends WebSocket {
        constructor(url) {
            super("wss://test");
            global.sendMsg = null
        }
    
        addEventListener(event, cb) {
            if (event === "open") {
                cb();
            } else if(event === "message") {
                global.sendMsg = cb;
            }
        }
    };

    test("testing message",() => {
      render(<LiveChat />);
      global.sendMsg({data:"test-msg"});
 
      expect....
    })
基本上,我覆盖了 WebSocket 类并将消息事件回调存储为一个常量,并在测试中触发它以模仿服务器消息。

关于reactjs - 如何使用 Jest 和 react-testing-library 测试 Websocket 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59101239/

相关文章:

node.js - 在 React 应用程序之间共享 Node.js 模块?

reactjs - 使用 Three.js 模拟通过管道的水流

php - 如何让 Ratchet WebSocket 保持事件状态?

java - 如何使用模拟对象替换内部代码部分中的原始对象?

python - 无法在 python 中模拟 __subclasses__

java - Spring:重写/模拟依赖的依赖

javascript - react : Dynamically setting element keys

javascript - 使用 React 和 Redux 的边栏过渡?

javascript - 解析不正确的 JSON

python - Django channel + 在发布请求后发送 websocket 消息