我正在尝试创建一个观察websocket事件的observable。
第一个observable为每个连接事件调用onNext,并传递作为下一个值连接的websocket实例。
然后需要创建另一个observable来侦听从该套接字断开事件。当发生这样的事件时,需要完成第一个可观测事件。我正在考虑扁平化或合并的方法,但不确定正确的使用方法。
// create an observable for each new socket connection event to server
const getSocketObservable = (socketServer) =>
Observable.fromEvent(socketServer, 'connection')
.takeUntil(
socket => Observable.fromEvent(socket, 'disconnect')
)
以下是我的测试用例
describe('getSocketObservable', () => {
let wss = null
let mockSocket = null
beforeEach(() => {
wss = new WebSocket.Server({ port: 3000 });
mockSocket = new EventEmitter()
})
afterEach((done) => {
wss.close(done)
})
it('returns observable on new server connection event', () => {
const onNext = spy()
getSocketObservable(wss).subscribe(
value => onNext(value),
)
wss.emit('connection', mockSocket)
expect(onNext.calledWith(mockSocket)).toBe(true)
})
it('returned observer source should complete when socket disconnects', () => {
const onCompleted = spy()
getSocketObservable(wss).subscribe(
value => console.log(value),
err => console.log(err),
onCompleted
)
wss.emit('connection', mockSocket)
mockSocket.emit('disconnect')
expect(onCompleted.calledOnce).toBe(true)
})
})
使用take(1)的以下天真方法使测试用例通过。但是,我需要完成生成的observable才会发生在断开事件之后,而不是在第一个任意值之后。
export const getSocketObservable = (socketServer) =>
Observable.fromEvent(socketServer, 'connection').take(1)
如何通过上述测试?