我有一个像这样的效果挂钩
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。最好的方法是什么?