React,jestでWebSocketがopenしているかのテスト
以下のようにWebSocketをuseRefで定義して接続が切れた後でも再接続できるように
connect関数を実装したカスタムフックがあります。
function useWebsocket(url: string) { const ws = useRef<WebSocket>(url); const connect = useCallback(() => { ws.current = new WebSocket(url); }, []); return { ws, connect } }
上記のカスタムフックをjest
でテストしたく以下のようにテストを書きました。
import { act, renderHook } from "@testing-library/react-hooks"; describe("", () => { const mockURL = "ws://localhost:3001"; afterEach(() => { WS.clean(); }); beforeEach(() => { mockWS = new WS(mockURL); }); it("", async () => { await act(async () => { const { result, unmount, rerender } = renderHook( (props) => useWebsocket(props), { initialProps: mockURL, } ); rerender(mockURL); await mockWS.connected; expect(result.current.ws).not.toBeNull(); expect(result.current.ws?.readyState).toBe(WebSocket.OPEN); await mockWS.close() expect(result.current.ws?.readyState).toBe(WebSocket.CLOSED) result.current.connect() expect(result.current.ws?.readyState).toBe(WebSocket.OPEN) // ここでエラー unmount(); await mockWS.closed; expect(result.current.ws?.readyState).toBe(WebSocket.CLOSED); }); }) })
発生している問題・エラーメッセージ
Expected: 1 Received: 3
補足情報(FW/ツールのバージョンなど)
"jest-websocket-mock": "^2.3.0" "react": "^17.0.2" "@testing-library/react-hooks": "^7.0.2"
あなたの回答
tips
プレビュー