如何用玩笑模拟事件源事件

问题描述 投票:0回答:0

我有一个像这样的效果挂钩

  const onMessage = useCallback(
    (message: MessageEvent) => {
      eventSource.current?.close()
      do stuff
    },
    [],
  )

  const onError = useCallback(async (_message: MessageEvent) => {
    eventSource.current?.close()
    try {
      stuff
    } catch (e) {
      dispatch(setErrorNotification(e, 'Fetching next task'))
    }
  }, [])

  useEffect(() => {
    eventSource.current = createEventSource(url)

    eventSource.current.addEventListener('message', onMessage)
    eventSource.current.addEventListener('error', onError)

    return () => {
      eventSource.current?.removeEventListener('message', onMessage)
      eventSource.current?.removeEventListener('message', onError)
      eventSource.current?.close()
    }
  }, [someId])

我一直在尝试弄清楚如何测试 onError 和 onMessage 函数,但无济于事。我已经想出如何添加事件侦听器(某种),如下所示

  const eventSourceSpy = jest.spyOn(util, 'createEventSource')
  const mockEventSource = {
    CLOSED: 0,
    CONNECTING: 0,
    OPEN: 0,
    dispatchEvent(_event: Event): boolean {
      return false
    },
    onerror: jest.fn(),
    onmessage: jest.fn(),
    onopen: jest.fn(),
    readyState: 0,
    url: '',
    withCredentials: false,
    addEventListener(
      _type: unknown,
      _listener: unknown,
      _options?: boolean | AddEventListenerOptions,
    ): void {},
    close(): void {},
    removeEventListener(
      _type: unknown,
      _listener: unknown,
      _options?: boolean | EventListenerOptions,
    ): void {},
  }

  eventSourceSpy.mockReturnValue(mockEventSource)
    
  // Simulate message event sent by server
  const messageData = { data: mockTask }
  const event = new MessageEvent('message', {
    data: JSON.stringify(messageData),
  })

  renderHook<typeof myHook>(() => myHook(), {
    store,
  })

  expect(eventSourceSpy).toHaveBeenCalledWith(route)

但我一直无法弄清楚如何触发

eventListener
与我的模拟事件源一起触发,以便我可以测试 onMessage 和 onError。最好的方法是什么?

jestjs mocking server-sent-events
© www.soinside.com 2019 - 2024. All rights reserved.