Я использую jest
для тестирования эпика redux-observable
, который разветвляется от внутреннего наблюдаемого объекта, созданного с помощью Observable.fromEvent
, и прослушивает определенное нажатие клавиши перед выполнением действия.
Я изо всех сил пытаюсь проверить, когда внутренний Observable не получает это конкретное нажатие клавиши и, следовательно, не выполняет действие.
Используя шутку, следующие тайм-ауты:
import { Observable, Subject } from 'rxjs'
import { ActionsObservable } from 'redux-observable'
import keycode from 'keycode'
const closeOnEscKeyEpic = action$ =>
action$.ofType('LISTEN_FOR_ESC').switchMapTo(
Observable.fromEvent(document, 'keyup')
.first(event => keycode(event) === 'esc')
.mapTo({ type: 'ESC_PRESSED' })
)
const testEpic = ({ setup, test, expect }) =>
new Promise(resolve => {
const input$ = new Subject()
setup(new ActionsObservable(input$))
.toArray()
.subscribe(resolve)
test(input$)
}).then(expect)
// This times out
it('no action emitted if esc key is not pressed', () => {
expect.assertions(1)
return testEpic({
setup: input$ => closeOnEscKeyEpic(input$),
test: input$ => {
// start listening
input$.next({ type: 'LISTEN_FOR_ESC' })
// press the wrong keys
const event = new KeyboardEvent('keyup', {
keyCode: keycode('p'),
})
const event2 = new KeyboardEvent('keyup', {
keyCode: keycode('1'),
})
global.document.dispatchEvent(event)
global.document.dispatchEvent(event2)
// end test
input$.complete()
},
expect: actions => {
expect(actions).toEqual([])
},
})
})
Я ожидал, что вызов input$.complete()
приведет к разрешению промиса в testEpic
, но для этого теста это не так.
Я чувствую, что что-то упускаю. Кто-нибудь понимает, почему это не работает?